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

时间:2015-09-09 18:51:23

标签: python django orm

Django具有Lower函数,但这仅适用于ASC(升序)有序查询。

示例网址

'/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

此模式的问题在于它不能用于排序多个字段。执行此操作的唯一方法是将descending参数直接传递给Lower,并且使用'-myfield'之类的任何内容失败,就像正常的Django ORM用于降序排序一样。

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

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

1 个答案:

答案 0 :(得分:0)

#Import Lower function
from django.db.models.functions import Lower

#For Ascending order
queryset.order_by(Lower('field_name'))

#For Descending order
queryset.order_by(Lower('field_name').desc())