Django Rest Framework 3.1 breaks pagination.PaginationSerializer

kstratis picture kstratis · Mar 18, 2015 · Viewed 9.8k times · Source

I just updated to Django Rest Framework 3.1 and it seems that all hell broke loose.

in my serializers.py I was having the following code:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
    model = task
    exclude = ('key', ...)

class PaginatedTaskSerializer(pagination.PaginationSerializer):
    class Meta:
        object_serializer_class = TaskSerializer

which was working just fine. Now with the release of 3.1 I can't find examples on how to do the same thing since PaginationSerializer is no longer there. I have tried to subclass PageNumberPagination and use its default paginate_queryset and get_paginated_response methods but I can no longer get their results serialized.

In other words my problem is that I can no longer do this:

class Meta:
    object_serializer_class = TaskSerializer

Any ideas?

Thanks in advance

Answer

kstratis picture kstratis · Mar 19, 2015

I think I figured it out (for the most part at least):

What we should have used from the very beginning is this:

Just use the built-in paginator and change your views.py to this:

from rest_framework.pagination import PageNumberPagination

class CourseListView(AuthView):
    def get(self, request, format=None):
        """
        Returns a JSON response with a listing of course objects
        """
        courses = Course.objects.order_by('name').all()
        paginator = PageNumberPagination()
        # From the docs:
        # The paginate_queryset method is passed the initial queryset 
        # and should return an iterable object that contains only the 
        # data in the requested page.
        result_page = paginator.paginate_queryset(courses, request)
        # Now we just have to serialize the data just like you suggested.
        serializer = CourseSerializer(result_page, many=True)
        # From the docs:
        # The get_paginated_response method is passed the serialized page 
        # data and should return a Response instance.
        return paginator.get_paginated_response(serializer.data)

For the desired page size just set the PAGE_SIZE in settings.py:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 15
}

You should be all set now with all the options present in the body of the response (count, next and back links) ordered just like before the update.

However there is one more thing that still troubles me: We should also be able to get the new html pagination controls which for some reason are missing for now...

I could definitely use a couple more suggestions on this...