Django ORM可以按列的特定值排序吗?

25 投票
4 回答
10047 浏览
提问于 2025-04-15 18:44

我有一个叫做'tickets'的表,里面有以下几列:

  • id - 主键 - 自动增加
  • title - 字符串,最多256个字符
  • status - 小整数 - 可以是1到5之间的任何值,由Django处理

当我执行一个 SELECT * 查询时,我希望状态为 status = 4 的记录排在最上面,其他的记录跟在后面。可以通过以下查询来实现:

select * from tickets order by status=4 DESC

这个查询可以通过Django的ORM来执行吗?我应该给 QuerySet.order_by() 方法传递什么参数呢?

4 个回答

8

对于像我一样需要帮助的人,尤其是那些正在使用较新版本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,具体取决于你查找的内容是否存在。如果你需要根据多个状态进行排序,这样的结果就不太理想了。

15

我在使用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的票会排在最前面。

希望对有人有帮助。

25

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个工具或库的时候,发现它的功能和自己想要的不太一样。这时候,大家就会去问问题,希望能得到帮助。

在这些讨论中,很多人会分享他们的经验和解决办法,帮助其他人更好地理解问题所在。通过这样的交流,大家可以一起学习,避免犯同样的错误。

总之,编程的路上难免会遇到各种各样的挑战,但只要我们愿意去问、去学,就一定能找到解决的办法。

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

撰写回答