2010-02-01 60 views
17

我有一个表 '门票' 有以下的列Can Django ORM可以对列的特定值执行ORDER BY吗?

  • ID - 主键 - 自动增加
  • 标题 - VARCHAR(256)
  • 状态 - SMALLINT(6) - 可以有之间的任意值1和5,通过Django的

处理的时候,我会做一个SELECT *我想在顶部status = 4行,其他记录将跟随他们。它可以通过以下查询来实现:

select * from tickets order by status=4 DESC 

该查询是否可以通过Django ORM执行?应该将什么参数传递给QuerySet.order_by()方法?

+0

您没有订购,您正在过滤(SQL WHERE子句)。 – stefanw 2010-02-01 11:49:29

+1

@stefanw - 如果只想要状态= 4的记录,我将它称为过滤。 – rubayeet 2010-02-01 11:52:35

回答

20
q = Ticket.objects.extra(select={'is_top': "status = 4"}) 
q = q.extra(order_by = ['-is_top']) 
+0

谢谢!为我节省了很多代码! – rubayeet 2010-02-01 12:19:35

+0

我对此表示赞赏,因为它的整洁,但后来发现文档中有一个说明.extra()计划将被弃用。这可以通过另一种方式来完成,例如与注释? https://docs.djangoproject.com/en/1.10/ref/models/querysets/#extra – shacker 2016-10-28 19:10:36

2

我在使用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的票将在开始处。

希望有人会发现它有用。

相关问题