Ответ 1
q = Ticket.objects.extra(select={'is_top': "status = 4"})
q = q.extra(order_by = ['-is_top'])
У меня есть таблица "билеты" со следующими столбцами
Когда я сделаю SELECT *
, я хочу, чтобы строки с status = 4
вверху, остальные записи будут следовать за ними. Это может быть достигнуто с помощью следующего запроса:
select * from tickets order by status=4 DESC
Можно ли выполнить этот запрос через Django ORM? Какие параметры следует передать методу QuerySet.order_by()
?
q = Ticket.objects.extra(select={'is_top': "status = 4"})
q = q.extra(order_by = ['-is_top'])
Я сделал это при использовании PostgresSql с django.
from django.db.models import Case, Count, When
Ticket.objects.annotate(
relevancy=Count(Case(When(status=4, then=1)))
).order_by('-relevancy')
Он вернет все объекты из Билета, но билеты со статусом = 4 будут в начале.
Надеюсь, что кто-то найдет это полезным.