使用 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:
- 过滤器class:
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)
是否有能力从 URL 订购带有 djangorestframework-filters ComplexFilterBackend 的结果?
DRF OrderingFilter 不适用于 djangorestframework-filters v.1.0.0.dev2 的标准示例。
我的代码在 query_set 中默认为 order_by:
- 过滤器class:
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)