Skip to content

Pagination#

Page Number Pagination (Default)#

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}
# views.py
from rest_framework.pagination import PageNumberPagination

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = PageNumberPagination

    # Or customize
    class CustomPagination(PageNumberPagination):
        page_size = 10
        page_size_query_param = 'page_size'
        max_page_size = 100

    pagination_class = CustomPagination

Response:

{
    "count": 100,
    "next": "http://api.example.com/posts/?page=2",
    "previous": null,
    "results": [...]
}

Usage: GET /api/posts/?page=2&page_size=10

Limit/Offset Pagination#

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 20,
}
# views.py
from rest_framework.pagination import LimitOffsetPagination

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    class CustomLimitOffset(LimitOffsetPagination):
        default_limit = 10
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        max_limit = 100

    pagination_class = CustomLimitOffset

Response:

{
    "count": 100,
    "next": "http://api.example.com/posts/?limit=10&offset=10",
    "previous": null,
    "results": [...]
}

Usage: GET /api/posts/?limit=10&offset=20

Cursor Pagination#

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
    'PAGE_SIZE': 20,
}
# views.py
from rest_framework.pagination import CursorPagination

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    class CustomCursor(CursorPagination):
        page_size = 10
        ordering = '-created_at'
        cursor_query_param = 'cursor'

    pagination_class = CustomCursor

Response:

{
    "next": "http://api.example.com/posts/?cursor=cD0yMDI0LTAxLTE1",
    "previous": null,
    "results": [...]
}

Usage: GET /api/posts/?cursor=cD0yMDI0LTAxLTE1

Disable Pagination#

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = None  # Disable pagination

Per-View Pagination#

from rest_framework.pagination import PageNumberPagination

class SmallResultsSetPagination(PageNumberPagination):
    page_size = 5

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = SmallResultsSetPagination

Next: Mixins & Permissions