[英]Is it possible to do case-insensitive ordering in descending order with the 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
,並且 lower 會失敗,並且像'-myfield'
一樣,就像正常的 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
#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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.