5

データの非正規化に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()が 2 回呼び出されています。コードにバグがあると思っていましたが、管理インターフェイスから保存しても同じ結果が得られます。

Docs は重複呼び出しを防ぐために使用dispatch_uidすることについて何か言っていますが、これが事実であるかどうかはわかりません。使い方はdispatch_uid?私はこれを試しましたが、運がありません:

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

関数が2回呼び出される理由とそれを回避する方法はありますか?

4

1 に答える 1

9

ご迷惑をおかけして申し訳ありませんが、dispatch_uid結局問題は解決しました。SOについて質問する前に、効果を確認するために開発サーバーを再起動する必要がある場合があることを覚えておいてください:)

于 2011-04-26T07:49:34.843 に答える