我有 3 个模型(简化):
class User(models.Model):
...
class PersonalAccount(models.Model):
user = models.OneToOneField(user)
balance = MoneyField() (like float)
class Withdrawal(models.Model):
date = models.DateField()
amount = MoneyField()
client = ForeignKey(User)
account =ForeignKey(PersonalAccount)
每次我保存提款时,我都必须这样做:
client.PersonalAccount.balance = client.PersonalAccount.balance - withdrawal.amount
client.PersonalAccount.save
我应该使用什么信号来执行此操作? pre_save
,post_save
还是init
?我想让它易于调试。如果任何帐户操作失败,它不应该保存提款。我也完全不确定我的关系语法是否正确,所以如果有人对此进行冷淡澄清......
从逻辑上讲,一旦取出,数量必须减少。因此,post_save
信号听起来很合适。从技术上讲,您也可以在这里使用pre_save
而不会遇到任何麻烦。
但是,由于这些是异步调用,因此您应该非常小心,因为它们行为不端。假设你每分钟执行 50 个请求(示例),你永远不知道哪个请求先完成(django 不保证请求的处理顺序)。在这里,您需要仔细管理异步调用。
或者,您可以简单地覆盖save()
模型方法并执行所需的操作。
def save(obj, *args, **kwargs):
super(ModelClass, self).save(*args, **kwargs)
# update your persoanl account
obj.PersonalAccount.save()
这比异步调用更好