Django Rest Framework: turn on pagination on a ViewSet (like ModelViewSet pagination)
Solution 1:
For those using DRF 3.1 or higher, they are changing the default way pagination is handled. See http://www.django-rest-framework.org/topics/3.1-announcement/ for details.
Now if you want to enable pagination for a ModelViewSet you can either do it globally by setting in your settings.py file:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100
}
Or if you just want it for one ModelViewSet you can manually set the pagination_class for just that viewset.
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 100
page_size_query_param = 'page_size'
max_page_size = 1000
class FooViewSet(viewsets.ModelViewSet):
pagination_class = StandardResultsSetPagination
This also allows you to tweak the way the pagination is handled for just that viewset.
DRF 3.1 also has introduced new types of default pagination schemes that you can use such as LimitOffset and Cursor.
Solution 2:
Pagination is only performed automatically if you're using the generic views or viewsets
The first roadblock is translating the docs to english. What they intended to convey is that you desire a generic viewset. The generic viewsets extend from generic ApiViews which have extra class methods for paginating querysets and responses.
Additionally, you're providing your own list
method, but the default pagination process is actually handled by the mixin:
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
The easy solution, use the framework code:
class Foo(mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = User.objects.all()
serializer = UserSerializer
The more complex solution would be if you need a custom list
method, then you should write it as you see fit but in the style of the above mixin code snippet.
Solution 3:
Try providing a class variable
paginate_by = 10 #This will paginate by 10 results per page.
Create a Custom ViewSet
which performs only list
operation as your case for here currently.
class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
pass
Now inherit your class Foo
with this custom made viewset
class Foo(ListModelViewSet):
paginate_by = 10
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
This should help you get the pagination working.