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.