Может ли Django ORM выполнить ORDER BY для определенного значения столбца? - PullRequest
18 голосов
/ 01 февраля 2010

У меня есть таблица «Билеты» со следующими столбцами

  • id - первичный ключ - автоинкремент
  • title - varchar (256)
  • status - smallint (6) - может иметь любое значение от 1 до 5, обрабатывается Django

Когда я сделаю SELECT *, я хочу строки с status = 4 вверху, остальные записи будут следовать за ними. Это может быть достигнуто с помощью следующего запроса:

select * from tickets order by status=4 DESC

Может ли этот запрос выполняться через Django ORM? Какие параметры следует передать методу QuerySet.order_by()?

Ответы [ 2 ]

20 голосов
/ 01 февраля 2010
q = Ticket.objects.extra(select={'is_top': "status = 4"})
q = q.extra(order_by = ['-is_top'])
6 голосов
/ 18 апреля 2017

Я сделал это при использовании PostgresSql с django.

from django.db.models import Case, Count, When

Ticket.objects.annotate(
    relevancy=Count(Case(When(status=4, then=1)))
).order_by('-relevancy')

Он вернет все объекты из Ticket, но билеты со статусом = 4 будут в начале.

Надеюсь, кто-нибудь найдет это полезным.

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