Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
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 view

Pagination large results को pages में divide करता है। Filtering specific criteria से filter करता है। Search full-text search provide करता है।

Was this answer clear?