как выполнить сортировку по вычисляемому значению в django
-
06-09-2019 - |
Вопрос
Эй, я хочу отсортировать объекты на основе вычисленного значения в django...как мне это сделать?
Вот пример модели профиля пользователя, основанной на переполнении стека, которая объясняет мое затруднительное положение:
class Profile(models.Model):
user = models.ForeignKey(User)
def get_reputation():
...
return reputation
reputation = property(get_reputation)
Итак, допустим, я хочу отсортировать пользователей по репутации.Как мне это сделать?Я знаю, ты не можешь просто так это сделать:
Profile.objects.order_by("-reputation")
Всем спасибо за вашу помощь :)
Решение
Если вам нужно выполнить сортировку в базе данных (потому что у вас много записей, и вам нужно, напримерразбить их на страницы), единственный реальный вариант - превратить репутацию в денормализованное поле (например,обновлено в переопределенном save()
метод на модели).
Другие советы
Поскольку ваш код вычисления существует только в Python, вы также должны выполнить сортировку в Python:
sorted (Profile.objects.all (), key = lambda p: p.reputation)
Начиная с Django-1.8, можно сортировать набор запросов с помощью выражения запроса до тех пор, пока вычисленное значение может быть отображено в SQL.Вы также можете использовать annotations
к модели как к order_by
срок.
from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")
Основные операции, такие как +
, -
, *
, /
и **
может использоваться с F()
.Кроме того, существует несколько других функций, таких как Count
, Avg
, Max
, ...
Ссылки:
- Агрегация -
order_by
- Создание запросов - фильтры могут ссылаться на поля в модели
- Выражения запроса - Встроенные выражения
Смотрите также этот SO Q & A: Упорядочить набор запросов по значению агрегированного поля