如何在DRF GenericAPIView上启用分页?

时间:2018-04-30 19:19:46

标签: django django-rest-framework

所以我最近从使用API​​View切换到GenericAPIView - 希望这可以让我访问更多的DRF功能 - 分页就是其中之一。

我的理解是我可以在全局添加此设置,分页将适用于所有GenericAPIViews

settings.py

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

这不会启用分页。

然后我还将pagination_class定义为类属性

class job(GenericAPIView):

    serializer_class = JobSerializer
    pagination_class = PageNumberPaginator
    def get_queryset(self):
        return Job.objects.all()

    def get(self, request, format=None):
        queryset = self.get_queryset()
        if queryset.exists():
            serializer = JobSerializer(queryset, many=True)
            return Response(serializer.data)
        else:
            return Response({"Returned empty queryset"}, status=status.HTTP_404_NOT_FOUND)

仍然没有分页。此端点返回100多条记录,并为?page = 1或?page = 2添加字符串查询,只返回相同的100+列表。

我在这里做错了什么?我知道我可以在我的课程中复制DRF的分页器视图方法 - 但我认为使用GenericAPIView可以让我轻松利用内置的分页?

2 个答案:

答案 0 :(得分:1)

您可以使用ListAPIView

class Job(ListApiView):
    serializer_class = JobSerializer
    pagination_class = PageNumberPaginator
    def get_queryset(self):
        return Job.objects.all()

答案 1 :(得分:0)

您应该返回Response而不是返回self.get_paginated_response(...)

因此,代码的结尾将是

return self.get_paginated_response(self.paginate_queryset(JobSerializer(queryset, many=True).data))