何时是" post_save" django中的信号被激活/被叫?

时间:2012-06-25 10:40:05

标签: python django

保存特定模型后,我将更新一些数据库表。我已经使用了@receiver(post_save装饰器。但是在这个装饰器函数中,值仍然没有保存在数据库中。我有一对多的关系但是当我得到使用kwargs['instance']保存的当前实例时,它没有子对象。但是当我从shell检查后保存,它确实有子对象。以下是我正在使用的代码:

@receiver(post_save, sender=Test)
def do_something(sender, **kwargs):
    test = kwargs['instance']
    users = User.objects.filter(tags__in=test.tags.values_list('id',flat=True))
    for user in users:
        other_model = OtherModel(user=user, test=test, is_new=True)
        other_model.save()

2 个答案:

答案 0 :(得分:3)

post_save在Model.save_base()的末尾发送,它本身由Model.save(()调用。这意味着如果你覆盖模型的save()方法,当你调用super时发送post_save( YourModel,self).save(* args,** kw)。

如果Tag在测试中有一个ForeignKey并且刚刚创建了Test实例,那么在这个阶段你不能期望有任何与你的Test实例相关的Tag实例,因为Tag实例显然需要首先知道Test实例的pk所以他们也可以得救。

答案 1 :(得分:0)

保存父实例时,将调用父实例的post_save。如果在此之后添加子项,则在调用父post_save时它们将不存在。