Interview question
How do you implement pagination, filtering, and search in DRF? DRF में pagination, filtering, और search कैसे implement करते हैं?
Answer
Pagination breaks large result sets into pages. Filtering narrows results based on specific criteria. Search provides full-text searching. DRF provides built-in pagination classes and django-filter for advanced filtering capabilities.
// Pagination - settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
}
// Pagination Types
from rest_framework.pagination import (
PageNumberPagination,
LimitOffsetPagination,
CursorPagination,
)
class StandardPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100
// Usage in ViewSet
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = StandardPagination
// Client requests
# /api/books/
# /api/books/?page=2
# /api/books/?page=1&page_size=50
// Filtering - Install django-filter
pip install django-filter
# settings.py
INSTALLED_APPS = ['django_filters']
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
],
}
// Filtering in ViewSet
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
# Exact field filtering
filterset_fields = ['author', 'published_date']
# Full-text search
search_fields = ['title', 'author', 'description']
# Sorting/Ordering
ordering_fields = ['created_at', 'price']
ordering = ['-created_at'] # Default ordering
// Client requests
# Filter: /api/books/?author=John
# Search: /api/books/?search=django
# Order: /api/books/?ordering=-price
# Combined: /api/books/?author=John&search=django&ordering=-created_at
// Advanced Filtering
from django_filters import FilterSet, CharFilter, NumberFilter, DateFromToRangeFilter
class BookFilterSet(FilterSet):
title__icontains = CharFilter(field_name='title', lookup_expr='icontains')
min_price = NumberFilter(field_name='price', lookup_expr='gte')
max_price = NumberFilter(field_name='price', lookup_expr='lte')
date_range = DateFromToRangeFilter(field_name='published_date')
class Meta:
model = Book
fields = ['author', 'title__icontains', 'min_price', 'max_price']
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
filterset_class = BookFilterSet
// Search with custom logic
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
search_fields = ['=title', '@author', '$description'] # = exact, @ partial, $ full-text
// Manual Pagination without default
from rest_framework.pagination import PageNumberPagination
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = None # Disable pagination for this viewPagination large results को pages में divide करता है। Filtering specific criteria से filter करता है। Search full-text search provide करता है।
Was this answer clear?