Skip to main content
 首页 » 编程设计

python之django 中的 "post_save"信号何时被激活/调用

2024年08月30日30cyq1162

我必须在保存特定模型后更新一些数据库表。我为此使用了 @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() 

请您参考如下方法:

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

如果 Tag 在 Test 上有 ForeignKey 并且 Test 实例刚刚创建,那么在这个阶段你不能期望有任何 Tag 实例与你的 Test 实例相关,因为 Tag 实例显然需要首先知道 Test 实例的 pk所以它们也可以被保存。