Python 是否可以使用Django ORM按降序进行不区分大小写的排序
Django具有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
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一些更多的信息