2009-09-13 7 views
1

J'utilise un modèle de Vote qui peut être génériquement lié à plusieurs modèles différents (pour vous permettre de voter sur différentes choses). Dans certains de mes codes, j'utilise des annotations pour compter le nombre total de votes et le nombre de votes positifs pour un jeu de questions. J'ai remarqué que si je place un vote sur un certain article, alors les autres types de modèles qui ont le même identifiant montrent aussi qu'ils ont été votés (à la fois par le nombre total de votes et par le nombre de votes positifs). Si je regarde la liste des votes pour l'objet qui n'a pas été voté, il retourne une liste vide (mais l'annotation dit encore +1).Annotation incorrecte avec GenericRelation

Voici quelques code:

class UserVote(): 

    user = models.ForeignKey(User) 
    vote = models.SmallIntegerField() 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

class Model1(): 
    votes = generic.GenericRelation(UserVote) 

class Model2(): 
    votes = generic.GenericRelation(UserVote) 

Et pour reproduire l'erreur:

m1 = Model1() 
m1.save() 
m2 = Model2() 
m2.save() 
m1.votes.add(UserVote(user_id=1, vote=1)) 
Model2.objects.all().annotate(tot_votes=Count('votes__vote'))[0].tot_votes # Returns 1 
Model2.objects.all().annotate(tot_votes=Count('votes__vote'))[0].votes.all() # Returns [] 

Je ne suis pas sûr que ce soit un bug dans le code annoter, ou si je manque un peu supplémentaire peu qui différencie entre les votes sur différents modèles génériques liés. Je cours la version de tronc de Django, btw.

Editer: Il semble qu'il y ait un bug ouvert dessus (je suppose que la prochaine fois je vais chercher d'abord) au http://code.djangoproject.com/ticket/10461. Je vais laisser cela ouvert pour la postérité/peut-être que quelqu'un peut trouver une solution de contournement.

Répondre

0

Ma solution éventuelle était de récupérer le nombre de votes des objets Vote, puis de l'attacher ensuite aux objets Model #, au lieu d'utiliser l'annotation sur les objets Model #. Cela devra se faire jusqu'à ce que le ticket mentionné dans la description soit pris en charge.

Questions connexes