Я использую модель голосования, которую можно связать с несколькими разными моделями (чтобы вы могли голосовать за разные вещи). В некоторых моих кодах я использую аннотации для подсчета общего количества голосов и положительного числа голосов для набора запросов. Я заметил, что если я проголосую за определенный элемент, то другие типы моделей с одинаковым идентификатором также показывают, что за них проголосовали (как по общему количеству голосов, так и по положительным). Если я смотрю на список голосов за объект, за который не проголосовали, он возвращает пустой список (но аннотация все еще говорит +1).
Вот код:
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)
И воспроизвести ошибку:
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 []
Я не уверен, является ли это ошибкой в коде аннотации, или мне не хватает какого-то дополнительного бита, который различает голоса по различным родственным моделям. Я использую транковую версию Django, кстати.
Edit:
Кажется, на ней открыта ошибка (думаю, в следующий раз, когда я начну сначала искать) в http://code.djangoproject.com/ticket/10461. Я оставлю это открытым для потомков / может быть, кто-то может найти обходной путь.