philipn/django-rest-framework-filters

Ordering (sorting) from URL in ComplexFilterBackend

Closed this issue · 1 comments

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.

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)