как отсортировать по вычисленному значению в Django - PullRequest
6 голосов
/ 31 мая 2009

Эй, я хочу отсортировать объекты на основе вычисленного значения в django ... как мне это сделать?

Вот пример модели профиля пользователя, основанной на переполнении стека, которая объясняет мое затруднительное положение:

class Profile(models.Model):
    user = models.ForeignKey(User)

    def get_reputation():
        ... 
        return reputation
    reputation = property(get_reputation)

Итак, скажем, я хочу отсортировать пользователей по репутации. Как я могу это сделать? Я знаю, что ты не можешь просто сделать это:

Profile.objects.order_by("-reputation")

Спасибо за вашу помощь всем:)

Ответы [ 3 ]

16 голосов
/ 31 мая 2009

Поскольку ваш код расчета существует только в Python, вам также необходимо выполнить сортировку в Python:

sorted (Profile.objects.all (), key = lambda p: p.reputation)
6 голосов
/ 04 ноября 2015

Начиная с Django-1.8, можно сортировать QuerySet с использованием выражений запросов , если вычисленное значение может быть отображено в SQL. Вы также можете использовать annotations для модели в качестве термина order_by.

from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")

Основные операции, такие как +, -, *, / и **, могут использоваться с F(). Кроме того, есть несколько других функций, таких как Count, Avg, Max, ...

Ссылки:

См. Также эти вопросы и ответы: Заказать QuerySet по совокупному значению поля

4 голосов
/ 31 мая 2009

Если вам нужно выполнить сортировку в базе данных (поскольку у вас много записей, и вам нужно, например, разбить их на страницы), единственный реальный вариант - превратить репутацию в денормализованное поле (например, обновленное в переопределенном save() метод по модели).

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