Django pre_save触发两次

6 投票
1 回答
3338 浏览
提问于 2025-04-16 16:02

我在使用Django的信号功能来处理数据去规范化。以下是我的代码:

# vote was saved
@receiver(pre_save, sender=Vote)
def update_post_votes_on_save(sender, instance, **kwargs):
    """ Update post rating """
    # is vote is being updated, then we must remove previous value first
    if instance.id:
        old_vote = Vote.objects.get(pk=instance.id)
        instance.post.rating -= old_vote.value
    # now adding the new vote
    instance.post.rating += instance.value
    instance.post.save()

我不太明白为什么,当我保存Vote实例时,update_post_votes_on_save()这个函数会被调用两次。我以为是我代码里的bug,但通过管理界面保存时也出现了同样的情况。

文档提到了一些关于使用dispatch_uid来防止重复调用的内容,但我不太明白这是否适用。我尝试过这样做,但没有成功:

@receiver(pre_save, sender=Vote, dispatch_uid="my_unique_identifier")

有没有人知道为什么这个函数会被调用两次,以及如何避免这种情况?

1 个回答

9

抱歉让你感到困惑,不过其实 dispatch_uid 解决了这个问题。记得在提问之前,可能需要重启开发服务器才能看到效果哦 :)

撰写回答