是否可以使用 Django-rest-framework 按 first_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/