1

我很难掌握来自 django 的 post_save/pre_save 信号。

发生的情况是我的模型有一个名为的字段status,当添加/保存该模型的条目时,必须根据某些条件相应地更改其状态。

我的模型如下所示:

 class Ticket(models.Model):    
    (...)   
    status = models.CharField(max_length=1,choices=OFFERT_STATUS, default='O')

还有我的信号处理程序,为 pre_save 配置:

def ticket_handler(sender, **kwargs):
   ticket = kwargs['instance']
   (...)
   if someOtherCondition:
       ticket.status = 'C'

现在,如果我在ticket.save()最后一行if语句的下方添加一个巨大的迭代黑洞会发生什么,因为这个动作调用了信号本身。这个问题发生在pre_savepost_save中。

嗯...我猜想在保存之前(甚至之后)更改条目的能力在 django 的世界中很常见。那么,我在这里做错了什么?信号是错误的方法还是我在这里遗漏了其他东西?

此外,一旦触发此 pre_save/post_save 函数,是否有可能访问另一个模型的实例并更改其上的特定行条目?

谢谢

4

2 回答 2

8

信号不是在保存之前更新同一模型中的字段的正确方法。覆盖模型的保存方法,而不是在这种情况下使用信号。

def save(self, force_insert=False, force_update=False):
    status = whatever....
    super(Ticket, self).save(force_insert, force_update)

对于其他模型的更新,信号是一种很好的方法,因为您可以轻松地解耦模型。具体来说,您可以添加一个 pre_/post_save 信号来触发操作,而无需修改已保存模型的代码(可能位于第三方的另一个应用程序中)。

于 2010-12-26T20:13:48.773 回答
3

我同意 Carles 的观点,这可能属于save(). 当您必须对信号执行此操作时,请确保save(). 您的测试可以重写为:

   if someOtherCondition and ticket.status != 'C':
       ticket.status = 'C'
       ticket.save()

以这种方式完成测试,您不会陷入无限递归。

于 2010-12-27T01:55:34.533 回答