Python Django ORM可以根据列的特定值进行排序吗?

Python Django ORM可以根据列的特定值进行排序吗?,python,mysql,django,orm,Python,Mysql,Django,Orm,我有一个“tickets”表,表中有以下列 id-主键-自动递增 标题-varchar(256) 状态-smallint(6)-可以有介于1和5之间的任何值,由Django处理 当我执行SELECT*操作时,我希望在顶部显示status=4的行,其他记录将跟随它们。可通过以下查询实现: select * from tickets order by status=4 DESC 这个查询可以通过Django ORM执行吗?哪些参数应该传递给QuerySet.order\u by()方法?我在d

我有一个“tickets”表,表中有以下列

  • id-主键-自动递增
  • 标题-varchar(256)
  • 状态-smallint(6)-可以有介于1和5之间的任何值,由Django处理
当我执行
SELECT*
操作时,我希望在顶部显示
status=4
的行,其他记录将跟随它们。可通过以下查询实现:

select * from tickets order by status=4 DESC

这个查询可以通过Django ORM执行吗?哪些参数应该传递给
QuerySet.order\u by()
方法?

我在django中使用PostgresSql时这样做了

q = Ticket.objects.extra(select={'is_top': "status = 4"})
q = q.extra(order_by = ['-is_top'])
from django.db.models import Case, Count, When

Ticket.objects.annotate(
    relevancy=Count(Case(When(status=4, then=1)))
).order_by('-relevancy')
它将返回票证中的所有对象,但状态为4的票证将位于开始处


希望有人会觉得它有用。

对于那些需要帮助的人,就像我一样,现在无意中发现了这一点,并且正在使用较新版本的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,具体取决于是否找到您的案例。如果按几个状态排序,则不理想

您不是在排序,而是在筛选(SQL WHERE子句)。@stefanw-如果只需要状态为4的记录,则称为筛选,我不需要。我对其整洁性进行了改进,但后来注意到文档中有一条注释说.extra()计划被弃用。这是否可以通过其他方式实现,例如使用注释?