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

1.2k views Asked by At

Are there ability to Ordering result with djangorestframework-filters ComplexFilterBackend from URL?

DRF OrderingFilter is not worked with standart examples for djangorestframework-filters v.1.0.0.dev2.

My code with default order_by in query_set:

  • Filter class:
from models import Template

class TemplateFilter(filters.FilterSet):
    class Meta:
        model = Template
        fields = {
            'id': '__all__',
            'status': '__all__',
            'name' : '__all__',
            'parent_id' : '__all__',
            }
  • View:
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? I want to see record with parent_id=guid first.

My input url for Django: GET /api/templates/?filters=(parent_id__isnull%3DTrue)%7C(parent_id%3Dguid)%26(ordering%3Dparent_id)&page=1 Decoded: /api/templates/?filters=(parent_id__isnull=True)|(parent_id=guid)&(ordering=parent_id)&page=1

1

There are 1 answers

0
ViktorL On BEST ANSWER

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)