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']
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
from rest_framework.pagination import LimitOffsetPagination
class PostViewSet(viewsets.ModelViewSet):
pagination_class = LimitOffsetPagination
from rest_framework.pagination import CursorPagination
class PostCursorPagination(CursorPagination):
page_size = 10
ordering = '-created_at'