Некорректная аннотация с помощью GenericRelation

#django

#django

Вопрос:

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

Редактировать: кажется, в нем открыта ошибка (я думаю, в следующий раз я буду искать сначала) в http://code.djangoproject.com/ticket/10461 . Я оставлю это открытым для потомков / может быть, кто-нибудь сможет найти обходной путь.

Ответ №1:

Мое окончательное решение состояло в том, чтобы получить подсчеты голосов из объектов Vote, а затем присоединить их к Model # objects впоследствии, вместо использования аннотации к Model # objects . Этого придется делать до тех пор, пока не будет обработан тикет, упомянутый в описании.