Django Rest Framework: Pagination w/ ListModelMixin

Viewed 1666

I've been following the django-rest-framework documentation examples but I'm having trouble getting pagination to work when using a `ListModelMixin and viewsets.GenericViewset

This does NOT paginate:

class InvitesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    permission_classes = [IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def list(self, request):
        invited_users = self.get_queryset() # just did this as a test
        serializer = UserSerializer(invited_users, many=True)
        return Response(serializer.data)

While this does:

class InvitesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    permission_classes = [IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer

How can I return a custom list response (because I need to filter on the request.user) with pagination while using ListModelMixin?

1 Answers

In your view you just overwritten the default list() function, this way you just removed the pagination part.

Look on the code of ListModelMixin

class ListModelMixin:
    """
    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)

if you need use filtered results, then use def get_queryset() function

def get_queryset(self):
    queryset = super(FooView, self).get_queryset()
    queryset = queryset.filter(foo=bar)
    return queryset
Related