使用 ComplexFilterBackend 在 django-rest-framework-filters 中从 URL 排序(排序)

Ordering (sorting) from URL in django-rest-framework-filters with ComplexFilterBackend

是否有能力从 URL 订购带有 djangorestframework-filters ComplexFilterBackend 的结果?

DRF OrderingFilter 不适用于 djangorestframework-filters v.1.0.0.dev2 的标准示例。

我的代码在 query_set 中默认为 order_by:

from models import Template

class TemplateFilter(filters.FilterSet):
    class Meta:
        model = Template
        fields = {
            'id': '__all__',
            'status': '__all__',
            'name' : '__all__',
            'parent_id' : '__all__',
            }
from serializers import TemplateListSerializer
from models import Template
from filters import TemplateFilter

class TemplateListView(ListCreateAPIView):
    filter_class = TemplateFilter
    def get(self, request, *args, **kwargs):
        self.queryset = Template.objects.all().order_by('-created')
        self.serializer_class = TemplateListSerializer
        return self.list(request, *args, **kwargs)

如何更改此代码以从 URL 请求中订购(排序)响应? 我想先看 parent_id=guid 的记录。

我对 Django 的输入 url: GET /api/templates/?filters=(parent_id__isnull%3DTrue)%7C(parent_id%3Dguid)%26(ordering%3Dparent_id)&page=1 解码: /api/templates/?filters=(parent_id__isnull=True)|(parent_id=guid)&(ordering=parent_id)&page=1

回答 - 强制设置两个后端过滤器:

  • 首先 - 用于搜索,ComplexFilterBackend

  • 其次 - 用于排序,OrderingFilter

     from serializers import TemplateListSerializer
     from models import Template
     from filters import TemplateFilter
     from rest_framework import filters
     from rest_framework_filters.backends import ComplexFilterBackend
    
     class TemplateListView(ListCreateAPIView):
         filter_class = TemplateFilter
    
         def get(self, request, *args, **kwargs):
             self.queryset = Template.objects.all()
             self.serializer_class = TemplateListSerializer
             self.filter_backends = [ComplexFilterBackend, filters.OrderingFilter]
             self.ordering_fields = ['parent_id', 'name']
             self.ordering = ['parent_id']
             return self.list(request, *args, **kwargs)