#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 . Этого придется делать до тех пор, пока не будет обработан тикет, упомянутый в описании.