Django pre_save сработал дважды - PullRequest
4 голосов
/ 19 апреля 2011

Я использую сигналы 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() вызывается дважды. Я думал, что в моем коде есть ошибка, но сохранение через интерфейс администратора дает тот же результат.

Документы говорят что-то о , используя dispatch_uid для предотвращения дублирования вызовов , но я не могу понять, так ли это. Как использовать dispatch_uid? Я пробовал это, но безуспешно:

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

Есть идеи, почему функция вызывается дважды и как ее избежать?

1 Ответ

7 голосов
/ 26 апреля 2011

Извините, за путаницу, но dispatch_uid все-таки решил проблему. Просто помните, что вам, возможно, придется перезапустить сервер разработки, чтобы увидеть эффект, прежде чем задавать вопрос о SO:)

...