Неверная аннотация в GenericRelation - PullRequest
1 голос
/ 13 сентября 2009

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

1 Ответ

0 голосов
/ 01 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...