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

xcitsw88  于 2022-10-31  发布在  Mysql
关注(0)|答案(3)|浏览(119)

我有一个表'tickets',它包含以下列

  • id -主键-自动递增
  • 标题- varchar(256)
  • status - smallint(6)-可以是1到5之间的任意值,由Django处理

当我执行SELECT *时,我希望以status = 4开头的行,其他记录将跟随其后。这可以通过以下查询实现:

select * from tickets order by status=4 DESC

这个查询可以通过Django ORM执行吗?QuerySet.order_by()方法需要传递哪些参数?

utugiqy6

utugiqy61#

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

ne5o7dgx2#

我是在使用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的票证将位于开头。
希望有人会觉得有用。

pb3skfrl

pb3skfrl3#

对于那些像我一样有需要的人来说,他们现在偶然发现了这个,并且正在使用更新版本的Django

from django.db.models import Case, When

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,这取决于是否找到您的案例。如果按几个状态排序,则不理想

相关问题