2011-04-19 6 views
4

J'utilise des signaux django pour la dénormalisation des données. Voici mon code:Django pre_save déclenché deux fois

# 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() 

Je ne comprends pas pourquoi, mais quand mon Vote instance est en cours d'enregistrement, update_post_votes_on_save() est appelé deux fois. Je pensais qu'il y avait un bug dans mon code, mais l'enregistrement via l'interface admin donne le même résultat.

Les docs disent quelque chose au sujet de using dispatch_uid to prevent duplicate calls, mais je ne peux pas comprendre si c'est le cas. Comment utiliser dispatch_uid? J'ai essayé ceci, mais sans chance:

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

Des idées pourquoi la fonction est appelée deux fois et comment l'éviter?

+0

Cherchez dans votre code l'emplacement où vous enregistrez le signal - assurez-vous qu'il n'est pas enregistré deux fois – Chris

+0

@chris : Le dispatch_uid devrait l'empêcher d'être enregistré deux fois. @ Silver-light: Comment avez-vous vérifié que votre gestionnaire est appelé deux fois? – shadfc

+0

Check this out http://groups.google.com/group/django-users/browse_thread/thread/0f8db267a1fb036f Peut-être que vous avez aussi des doublons. – fceruti

Répondre

6

Je suis désolé, pour la confusion, mais dispatch_uid a résolu le problème, après tout. Rappelez-vous, que vous devrez peut-être redémarrer le serveur de développement pour voir l'effet, avant de poser une question sur SO :)

Questions connexes