如何在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
相关产品推荐
相关产品推荐

