Django ORM可以按列的特定值排序吗?
我有一个叫做'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'])