DRF Pagination
2018, Nov 04
What is pagination?
If there are too many records in a list, it’s better to avoid requesting only one API.
In this case, you can seperate the requests in several pages. And DRF(Django RestFramework) support this pagination.
- PageNumberPagination : Pagination with
pageparameters- http://api.example.org/accounts/?page=4
- http://api.example.org/accounts/?page=4&page_size=100
- LimitOffsetPagination : Pagination with
limitparameter- http://api.example.org/accounts/?limit=100
- http://api.example.org/accounts/?offset=400&limit=100
In rest_framework/generics.py, GeneericAPIView has pagination_class = PageNumberPagination setting.
But from Ver. 3.7.0, this setting has been change to pagination_class = None.
Accordingly, There is no pagination process because PAGE_SIZE is None.
If you want to apply pagination, there are two options.
- apply pagination
globally
In Project/settings.py, set option below. set the specific PAGE_SIZE.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':20
}
- apply pagination at
API
# application/pagination.py
from rest_framework.pagination import PageNumberPagination
class PostPageNumberPagination(PageNumberPagination):
page_size = 20
# application/views.py
from .pagination import PostPageNumberPagination
class PostViewSet(viewsets.ModelViewSet):
...
pagination_class = RestaurantPageNumberPagination
You can set default pagination in globally and additionally set another pagination API by API.