An API endpoint returning 100,000 unpaginated records will crash your database and overwhelm client devices with massive JSON payloads. DRF provides robust tools to paginate, filter, and sort results efficiently.
# Install django-filter
pip install django-filter
Define a dedicated FilterSet with custom lookups:
# blog/filters.py
import django_filters
from .models import BlogPost
class BlogPostFilter(django_filters.FilterSet):
min_price = django_filters.NumberFilter(field_name="premium_price", lookup_expr='gte')
max_price = django_filters.NumberFilter(field_name="premium_price", lookup_expr='lte')
category_slug = django_filters.CharFilter(field_name="category__slug", lookup_expr='iexact')
class Meta:
model = BlogPost
fields = ['category_slug', 'is_published', 'min_price', 'max_price']
# blog/views.py
from rest_framework import viewsets, filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import BlogPost
from .serializers import BlogPostSerializer
from .filters import BlogPostFilter
class BlogPostViewSet(viewsets.ModelViewSet):
queryset = BlogPost.objects.filter(is_published=True)
serializer_class = BlogPostSerializer
# 3 Filter Backends configured simultaneously
filter_backends = [
DjangoFilterBackend, # Exact & range filtering
filters.SearchFilter, # Full-text search (?search=...)
filters.OrderingFilter # Dynamic sorting (?ordering=-created_at)
]
filterset_class = BlogPostFilter
search_fields = ['title', 'summary', 'author__user__username']
ordering_fields = ['created_at', 'premium_price', 'view_count']
ordering = ['-created_at'] # Default sort
Clients can now perform powerful, compound queries effortlessly:
GET /api/posts/?category_slug=tech&min_price=10&search=django&ordering=-view_count&page=2
Customize page sizes and client overrides by subclassing PageNumberPagination:
# blog/pagination.py
from rest_framework.pagination import PageNumberPagination
class CustomArticlePagination(PageNumberPagination):
page_size = 12 # Default items per page
page_size_query_param = 'page_size' # Allows client: ?page_size=24
max_page_size = 100 # Hard cap to protect server memory
page_query_param = 'p' # Parameter: ?p=2
| Pagination Type | URL Query Format | Ideal Real-World Use Case |
|---|---|---|
| PageNumberPagination | ?page=3&page_size=10 |
Standard web tables, admin lists, blog article directories. |
| LimitOffsetPagination | ?limit=20&offset=40 |
Mobile apps, flexible client-side infinite scroll libraries. |
| CursorPagination | ?cursor=cD0yMDI2LTEx |
High-velocity real-time social feeds, live notification feeds. |
Broaden your backend architecture, REST API design, and production engineering expertise:
Apply filterset_fields and search_fields to ViewSets.
Understand the underlying ORM queries executed by filter backends.
Optimize paginated queries with select_related to keep APIs fast.
Build a filterable product catalog API with price ranges and search.