【问题标题】:Is it possible to do case-insensitive ordering in descending order with the Django ORM是否可以使用 Django ORM 按降序进行不区分大小写的排序
【发布时间】: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

【问题讨论】:

标签: python django orm


【解决方案1】:
#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())

【讨论】:

  • 请添加解释以提高洞察力并为 OP 提供更多信息
猜你喜欢
  • 2015-10-29
  • 2011-03-25
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多