Как аннотировать QuerySet, используя несколько значений полей? - PullRequest
2 голосов
/ 06 сентября 2011

У меня есть модель под названием «История», в которой есть два целочисленных поля, которые называются «взгляды» и «голоса».Когда я получаю все объекты Story, я хотел бы аннотировать возвращенный QuerySet с полем «рейтинга», которое просто «просмотры» / «голоса».Тогда я бы хотел отсортировать QuerySet по «ранжированию».Что-то вроде ...

Story.objects.annotate( ranking=CalcRanking('views','votes') ).sort_by(ranking)

Как я могу сделать это в Django?Или это должно быть сделано после получения QuerySet в Python (например, создание списка, который содержит рейтинг для каждого объекта в QuerySet)?

Спасибо!

PS: В моей настоящей программерасчет ранжирования не так прост, как указано выше, и зависит от других фильтров исходного QuerySet, поэтому я не могу сохранить его как другое поле в модели Story.

1 Ответ

1 голос
/ 17 ноября 2011

В Django вещи, которые вы можете передать annotateaggregate), должны быть подклассами django.db.models.aggregates.Aggregate. Вы не можете просто передать ему произвольные объекты Python, так как агрегация / аннотация фактически происходит внутри базы данных (в этом весь смысл aggregate и annotate). Обратите внимание, что написание пользовательских агрегатов не поддерживается в Django (для этого нет документации). Вся доступная информация - это минимальный исходный код: https://code.djangoproject.com/browser/django/trunk/django/db/models/aggregates.py

Это означает, что вы должны либо каким-либо образом хранить расчеты в базе данных, выяснять, как работает API агрегирования, или использовать raw sql (raw метод в Manager) для выполнения своих действий.

...