[英]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.