Skip to content

Filtering & Pagination#

django-filter Install#

pip install django-filter

Global Filter Config#

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
    ],
}

Basic Filtering#

class PostViewSet(viewsets.ModelViewSet):
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['author', 'is_published']

Search & Ordering#

from rest_framework.filters import SearchFilter, OrderingFilter

class PostViewSet(viewsets.ModelViewSet):
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['title', 'content']
    ordering_fields = ['created_at', 'views']

Custom FilterSet#

import django_filters

class PostFilter(django_filters.FilterSet):
    min_views = django_filters.NumberFilter(field_name="views", lookup_expr='gte')
    title = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Post
        fields = ['title', 'min_views']

Page Number Pagination#

from rest_framework.pagination import PageNumberPagination

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000

class PostViewSet(viewsets.ModelViewSet):
    pagination_class = LargeResultsSetPagination

Limit Offset Pagination#

from rest_framework.pagination import LimitOffsetPagination

class PostViewSet(viewsets.ModelViewSet):
    pagination_class = LimitOffsetPagination

Cursor Pagination (Fast for large data)#

from rest_framework.pagination import CursorPagination

class PostCursorPagination(CursorPagination):
    page_size = 10
    ordering = '-created_at'