Python 是否可以使用Django ORM按降序进行不区分大小写的排序

Python 是否可以使用Django ORM按降序进行不区分大小写的排序,python,django,orm,Python,Django,Orm,Django具有Lower功能,但这仅适用于ASC(升序)有序查询 示例URL: '/api/locations/?ordering=-number,name' 我们使用了以下模式: from django.db.models.functions import Lower class OrderingQuerySetMixin(object): def get_queryset(self): queryset = self.queryset orde

Django具有
Lower
功能,但这仅适用于
ASC
(升序)有序查询

示例URL:

'/api/locations/?ordering=-number,name'
我们使用了以下模式:

from django.db.models.functions import Lower

class OrderingQuerySetMixin(object):

    def get_queryset(self):
        queryset = self.queryset
        ordering = self.request.query_params.get('ordering', None)
        if ordering:
            if ordering.startswith('-'):
                queryset = queryset.order_by(Lower(ordering[1:])).reverse()
            else:
                queryset = queryset.order_by(Lower(ordering))
        return queryset
这种模式的问题在于,它不适用于对多个字段进行排序。这样做的唯一方法是将
降序
参数直接传递给
Lower
,而Lower会像正常的Django ORM一样在降序时使用类似
'-myfield'
的任何操作失败

以下是当前模式,它接受多个参数进行排序,但不处理降序:

class OrderingQuerySetMixin(object):
    """Return a case-insensitive ordered queryset."""

    def eval_param(self, param):
        if param.startswith('-'):
            return param[1:]
        else:
            return param

    def get_queryset(self):
        queryset = self.queryset
        ordering = self.request.query_params.get('ordering', None)
        if ordering:
            queryset = queryset.order_by(
                *[Lower(self.eval_param(p)) for p in ordering.split(',')]
            )
        return queryset
#导入下部功能
从django.db.models.functions导入
#升序
queryset.order_by(下('field_name'))
#按降序排列
queryset.order_by(Lower('field_name').desc())

使用
.extra()
@上王,那工作了。谢谢最后的代码是什么。我也在寻找一个解决方案,请添加一个解释,以提高洞察力,并给OP一些更多的信息