如何在 DRF GenericAPIView 上启用分页?

问题描述 投票:0回答:3

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

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

设置.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 可以让我轻松利用内置分页?

django django-rest-framework
3个回答
3
投票

您可以使用

ListAPIView

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

2
投票

您应该返回

Response
,而不是返回 
self.get_paginated_response(...)

对象

所以你的代码的结尾是

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

0
投票

在你的视图中,首先导入PageNumberPagination

from rest_framework.pagination import PageNumberPagination

然后编写以下代码

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 30
    page_size_query_param = 'page_size'
    max_page_size = 30

class PostsListAPIView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = LargeResultsSetPagination
© www.soinside.com 2019 - 2024. All rights reserved.