python - 使用 django-filter 进行不区分大小写的排序

标签 python django django-rest-framework django-filter

是否可以使用 Django-rest-frameworkfirst_name 进行不区分大小写 排序。

代码如下:

import django_filter

class PersonFilter(django_filters.FilterSet):
    class Meta:
        model = Person
        fields = ('first_name_lower',)
        order_by = ('first_name_lower',)

class PersonViewSet(BaseModelViewSet):
    queryset = Person.objects.all()
    permission_classes = (permissions.IsAuthenticated,)
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = PersonFilter

有没有一种简单的方法可以使用 django-filter 进行 case-insensitive 排序?

Here django-filter 有不区分大小写的搜索的文档,但没有排序的文档。

在 Django 文档中,代码对此有些晦涩,这让我怀疑它是否存在于 django-filter 中。下面是关于如何使用 Django ORM 执行此操作的 Django 文档代码片段:

>>> from django.db.models.functions import Lower
>>> MyModel.objects.order_by(Lower('myfield'))

最佳答案

您可能想要子类化 OrderingFilter 并将其用作您的 filter_backend 以便您可以重用代码。

from rest_framework.filters import OrderingFilter
from django.db.models.functions import Lower

class CaseInsensitiveOrderingFilter(OrderingFilter):
    def filter_queryset(self, request, queryset, view):
        ordering = self.get_ordering(request, queryset, view)

        if ordering is not None:
            if ordering.startswith('-'):
                queryset = queryset.order_by(Lower(ordering[1:])).reverse()
            else:
                queryset = queryset.order_by(Lower(ordering))
        return queryset


class PersonViewSet(ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = MySerializer
    permission_classes = (permissions.IsAuthenticated,)
    filter_backends = (CaseInsensitiveOrderingFilter,)

关于python - 使用 django-filter 进行不区分大小写的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31862420/

相关文章:

python - 我如何测试用户是否具有查看权限

Python - 为什么我们必须在 while 循环中而不是在 for 循环中初始化标识符?

python - github api v3 中的 oauth 流程不起作用

jquery - 如何在单个 django View 中传递多个 ajax 调用

python - Django 表单字段显示记录的 uuid

python - 在 Django Rest Framework 中添加特定的方法处理程序 detail_route

python - python和 celery : override hard timeouts for use with gevent pool

python - 嵌入式 pdf 文件未显示在 Django 中

python - 如何在 Django 管理中删除面包屑

django - 模块未找到错误: No module named 'drf_multiple_model'