3

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

@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()
4

2 回答 2

3

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

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

于 2012-06-25T11:00:57.100 回答
0

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

于 2012-06-25T10:54:25.950 回答