0

我有 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_savepost_save还是init那些?我想让调试变得容易。如果任何账户操作失败,它不应该保存提款。我也完全不确定我的关系语法是否正确,所以如果有人冷淡地澄清这一点..

4

1 回答 1

0

从逻辑上讲,一旦取出,金额就必须减少。所以,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()

这比异步调用好

于 2013-11-10T17:24:48.997 回答