【发布时间】:2015-12-05 20:54:33
【问题描述】:
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,并且像普通的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
【问题讨论】:
-
使用
.extra()。 stackoverflow.com/questions/3409047/… -
@ShangWang 成功了。谢谢!
-
什么是最终代码。我也在寻找解决方案stackoverflow.com/questions/47344450/…