Python 3.x 我以字母顺序的形式按字段获取顺序。我想用django orm按字段的多个值对_进行排序。名单如下:
Python 3.x 我以字母顺序的形式按字段获取顺序。我想用django orm按字段的多个值对_进行排序。名单如下:,python-3.x,django,django-models,django-rest-framework,django-views,Python 3.x,Django,Django Models,Django Rest Framework,Django Views,orderbyList=['Day','午后','Night'] 我正在编写一个查询,如下所示: modelclasstance.objects.all().order\u by(shift\u name=*orderbyList) shift_name是列的名称,“Day”、“午后”、“Night”是 价值观 我的最终输出应该是 全天先记录,然后是下午,然后是晚上,而不是按字母顺序 您可以为orderbyList中的每个值注释一个值,并根据该值对查询集进行排序: from django.d
orderbyList=['Day','午后','Night']
我正在编写一个查询,如下所示:
modelclasstance.objects.all().order\u by(shift\u name=*orderbyList)
您可以为
orderbyList
中的每个值注释一个值,并根据该值对查询集进行排序:
from django.db.models import Case, Value, When
orderbyList = ['Day','Afternoon','Night']
order_case = Case(
*[When(shift_name=value, then=Value(index)) for index, value in enumerate(orderbyList)],
default=Value(len(orderbyList))
)
queryset = modelclassinstance.objects.annotate(order_case=order_case).order_by('order_case')
注意:虽然此解决方案可行,但您应该考虑将shift\u name
置于一个独立的模型中,该模型将
一些字段指示它的顺序以及该字段上的顺序。你的
当前模型应该只具有此模型的外键,以便
shift\u name
。这在效率方面会更好
您需要使用条件表达式(Case/When语法): 比如:
从django.db.models导入值、大小写、时间、整数字段
modelclassinstance.objects.annotate(
定制订单=案例(
当(shift_name='Day',然后=值(1)),
当(shift_name='午后',然后=值(2)),
当(shift_name='Night',然后=值(3)),
输出\字段=整数字段()
)
).order\u by('custom\u order')