You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django QuerySet中调整Task优先级排序(High/Medium/Low)

解决方案

因为字符串默认按字母排序,"Low"的首字母L在"Medium"的M之前,所以会出现当前的排序结果。要实现High > Medium > Low的自定义排序,有两种常用方法:

方法一:数据库层面排序(推荐)

利用Django的Case和When构造自定义排序规则,直接在数据库查询阶段完成排序,效率更高:

from django.db.models import Case, When, Value, IntegerField, Count

# 为每个优先级分配排序权重
priority_sort = [
    When(priority='High', then=Value(1)),
    When(priority='Medium', then=Value(2)),
    When(priority='Low', then=Value(3)),
]

tasks = Tasks.objects.values("priority").annotate(count=Count("priority")).order_by(Case(*priority_sort, output_field=IntegerField()))

方法二:Python层面排序

如果数据量不大,也可以先获取QuerySet,再在Python中按自定义规则排序:

from django.db.models import Count

tasks = Tasks.objects.values("priority").annotate(count=Count("priority"))
# 定义优先级的排序映射
order_rule = {'High': 0, 'Medium': 1, 'Low': 2}
# 按映射值排序
sorted_tasks = sorted(tasks, key=lambda item: order_rule[item['priority']])

执行后就能得到你期望的排序结果:

<QuerySet [{'priority': 'High', 'count': 3}, {'priority': 'Medium', 'count': 3}, {'priority': 'Low', 'count': 3}]>

内容的提问来源于stack exchange,提问作者logan_9997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:24:10