Как использовать приложение django и django-голосования, как я могу заказать набор запросов в соответствии с голосами каждого элемента?

(Я новичок в Python и Django, поэтому, пожалуйста, потерпите меня на секунду. Я прошу прощения, если на этот вопрос ответили в другом месте и не смог найти его)

Допустим, у меня есть модель Link, и с помощью приложения django-голосования пользователи могут голосовать за экземпляры ссылок. Как я могу заказать эти ссылки экземпляры в соответствии с их счетом, например. показать тех, кто набрал больше очков в первую очередь.

Я предполагаю, что мог бы использовать менеджер get_top для django-голосования, но это дало бы мне только лучшие экземпляры ссылок и не учитывало бы другие параметры, которые я хотел бы добавить (например, те ссылки, которые принадлежат конкретному пользователю). или пейджинг или что-то).

Мое предположение было бы написать собственный менеджер для моей модели Link, где я могу отфильтровать набор запросов в соответствии с оценкой каждого элемента. Если я правильно понимаю, это потребует от меня циклического прохождения каждого элемента, проверьте его оценку, а затем поместите в него список (или словарь), который затем будет отсортирован в соответствии с оценкой каждого элемента. Это не будет возвращать набор запросов, но словарь с каждым элементом.

Я что-то здесь упускаю?

редактировать:

Вот урезанная версия модели Link:

class Link(models.Model):
    user = models.ForeignKey('auth.User')
    category = models.ForeignKey(Category)  
    date = models.DateTimeField( auto_now_add=True, null=True, blank=True )
    is_deleted = models.BooleanField(default=False, blank=True)
    links = ValidLinkManager()
    objects = models.Manager()

и когда пользователь голосует, у меня есть это на мой взгляд:

Vote.objects.record_vote(link, user, vote)

где ссылка - это экземпляр Link, пользователь - это экземпляр auth.User, а голосование - 1, 0 или -1. ValidLinkManager просто отфильтровывает те ссылки, для которых is_deleted имеет значение True.

2 ответа

get_top метод в VoteManager не так уж и сложен. Посмотрите на его код (в Manager.py:122). Вы можете легко создать его версию, которая принимает фильтр в качестве другого параметра и применяет его к набору запросов "объекты" после того, как он его создает, в строке 158 - таким образом, вы можете добавить другие фильтры, такие как пропущенные.

Может быть, вы также можете предложить это как патч обратно Джонатану, и он внесет это в django-голосование:)

Я решил использовать родовое отношение в моей модели:

votes = generic.GenericRelation(Vote)

а затем агрегировать это:

my_model.objects.annotate(num_votes=Count('votes'))

В этом случае я просто подсчитываю количество голосов, полученных объектами, но вы можете переключиться Count с Avg чтобы получить среднее.

Так как это не работает с Django по умолчанию, я установил django-generic-aggregation,

Другие вопросы по тегам