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