как выполнить сортировку по вычисляемому значению в django

StackOverflow https://stackoverflow.com/questions/930865

Вопрос

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

Ссылки:

Смотрите также этот SO Q & A: Упорядочить набор запросов по значению агрегированного поля

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top