簡體   English   中英

更新外鍵時,Django 信號不會更新相關的 model

[英]Django signals doesn't update related model when foreign key updated

每次使用信號更改外鍵時,我都想更新相關的 model,類似於m2m_changed但用於外鍵。

用戶 model:

class User(AbstractUser):
    balance = models.FloatField(default=0)

事務 model:

class Transaction(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='transactions')
    order = models.OneToOneField('Payment.Order', on_delete=models.CASCADE, related_name='transaction')
    transaction_type = models.CharField(choices=[
        ('transfer', 'Transfer'),
        ('received', 'Received'),
    ], max_length=20, default='transfer')
    created = models.DateTimeField(auto_now_add=True)

我需要在用戶下創建新交易時,將其收集到余額中。

信號代碼:

@receiver(pre_save, sender=User)
    def collect_transaction(sender, instance, **kwargs):
    balance = instance.transactions.aggregate(Sum('order__price'))
    print(balance)

但只有當我從用戶 model 更新它時它才有效,而不是事務。

例如,此代碼將使信號起作用:

user.transactions.add(transaction)
user.save()

而此代碼不會使信號起作用:

Transaction.objects.create(user=1, order=1, transaction_type='received')

只有保存User model 時,才會發送您的信號。 似乎您希望在保存任何Transaction時發送它,因此您應該嘗試使用Transaction作為發件人而不是用戶:

@receiver(post_save, sender=Transaction)
def collect_transactions(sender, instance, **kwargs):
    user = instance.user
    user.balance = user.transactions.aggregate(Sum('order__price'))
    user.save()

至於您在保存用戶時有信號的原始示例,我正在嘗試考慮一種情況,您將更新用戶但不更新其相關交易,但需要更新余額。 如果確實存在這種情況,您最好重寫用戶 model 上的save()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM