Django ORM可以对列的特定值执行ORDER BY吗?

时间:2010-02-01 11:37:40

标签: python mysql django orm

我有一张表'门票',其中包含以下列

  • 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()方法?

3 个答案:

答案 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,具体取决于是否找到您的案例。如果要同时订购几个状态,则不理想