gpt4 book ai didi

python - 更新外键时,Django 信号不会更新相关模型

转载 作者:行者123 更新时间:2023-12-05 06:18:14 25 4
gpt4 key购买 nike

每次使用信号更改外键时,我都想更新相关模型,类似于 m2m_changed 但对于外键。

用户模型:

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

交易模型:

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)

但它仅在我从用户模型更新它时有效,而不是事务。

例如,此代码将使信号起作用:

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

鉴于此代码不会使信号起作用:

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

最佳答案

只有当 User 模型被保存时,您的信号才会被发送。您似乎希望在保存任何 Transaction 时发送它,因此您应该尝试使用 Transaction 作为发件人而不是 User:

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

关于保存用户时发出信号的原始示例,我正在尝试考虑这样一种情况:您要更新用户但不更新其相关交易,但仍需要更新余额。如果确实存在这种情况,您最好覆盖用户模型上的 save() 方法。

关于python - 更新外键时,Django 信号不会更新相关模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61323653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com