Ordering (sorting) from URL in ComplexFilterBackend
Closed this issue · 1 comments
ViktorL-github commented
Hello Community.
Are there ability to Ordering result with ComplexFilterBackend from URL?
DRF OrderingFilter is not worked with standart examples for drf-filters v. 1.0.0.dev2.
My code with default order_by in query_set:
- filter class:
import rest_framework_filters as filters
from models import Template
class TemplateFilter(filters.FilterSet):
class Meta:
model = Template
fields = {
'id': '__all__',
'status': '__all__',
'name' : '__all__',
'parent_id' : '__all__',
}
- View:
from rest_framework.generics import ListCreateAPIView
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)
How I can to change this code for ordering (sort) response from URL Request?
GET /api/templates/?filters=(parent_id__isnull%3DTrue)%7C(parent_id%3Dguid)%26(ordering%3Dparent_id)&page=1
Best Regards,
ViktorL.
ViktorL-github commented
Answer - mandatory set two backend filters:
- First - for search, ComplexFilterBackend
- Second - for ordering, 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)