簡體   English   中英

是否可以使用 Django ORM 按降序進行不區分大小寫的排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM