我有一张表'门票',其中包含以下列
当我执行SELECT *
时,我希望顶部带有status = 4
的行,其他记录将跟随它们。它可以通过以下查询来实现:
select * from tickets order by status=4 DESC
可以通过Django ORM执行此查询吗?应该将哪些参数传递给QuerySet.order_by()
方法?
答案 0 :(得分:20)
q = Ticket.objects.extra(select={'is_top': "status = 4"})
q = q.extra(order_by = ['-is_top'])
答案 1 :(得分:6)
我在使用带有django的PostgresSql时做到了这一点。
from django.db.models import Case, Count, When
Ticket.objects.annotate(
relevancy=Count(Case(When(status=4, then=1)))
).order_by('-relevancy')
它将从Ticket返回所有对象,但status = 4的票证将在开头。
希望有人会发现它很有用。
答案 2 :(得分:1)
对于像我这样需要帮助的人,现在偶然发现了这个问题,并且正在使用django的较新版本
Ticket.objects.annotate(
relevancy=Case(When(status=4, then=1), When(status=3, then=2), When(status=2, then=3), output_field=IntegerField())
).order_by('-relevancy')
使用Count()将返回1或0,具体取决于是否找到您的案例。如果要同时订购几个状态,则不理想