我应该使用什么信号来更改与Django相关的对象

时间:2013-11-04 14:27:34

标签: django signals models database-relations

我有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_saveinit个?我想让调试变得容易。如果任何帐户操作失败,则不应保存提款。 我还完全不确定我的关系语法是否正确,所以如果有人冷清楚这一点......

1 个答案:

答案 0 :(得分: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()

这比异步调用

更好