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
答案 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())