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)

  • shift_name是列的名称,“Day”、“午后”、“Night”是 价值观

  • 我的最终输出应该是

    全天先记录,然后是下午,然后是晚上,而不是按字母顺序


  • 您可以为
    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')