【问题标题】:Why does my django rest-framework pagination does not work?为什么我的 django rest-framework 分页不起作用?
【发布时间】:2021-12-07 01:21:12
【问题描述】:

我有一个 Django Restframework 项目。 这是我的看法:

class JobView(viewsets.ReadOnlyModelViewSet):
    queryset = Job.objects.all()
    serializer_class = JobSerializer
    filter_backends = [filters.OrderingFilter, DjangoFilterBackend, filters.SearchFilter]
    search_fields = [...]
    ordering_fields = ['jobId']
    ordering = ['-jobId']
    filterset_fields = ['jobId', 'status']
    pagination_class = StandardResultsSetPagination

和我的分页类:

class StandardResultsSetPagination(LimitOffsetPagination):
    page_size = 1

视图在路由器中注册:

router.register(r'jobs', JobView)

问题是,它根本不分页。它只是忽略了 pagination_class 属性。

我也试过了:

class JobView(generics.ListAPIView)

并在没有路由器的情况下注册了视图。但问题是一样的。它不分页,只返回一个包含所有作业的 json 列表。

在settings.py中为项目全局定义的情况下,如何在这个视图中实现分页?

【问题讨论】:

  • 如果你向'jobs/?limit=2&offset=1'页面发出请求怎么办?
  • 它神奇地起作用。起初我在 settings.py 中全局定义了它,在这种情况下它已经分页了,没有 ?limit=2&offset=1 谢谢!
  • @EinEsellerEniE:可能使用LimitOffsetPagination,也许您应该使用PageNumberPagination
  • 问题是我一开始尝试了PageNumberPagination,它改变了输出。我加快了 LimitOffsetPagination 的工作。但在那种情况下,我不得不使用'jobs/?limit=2&offset=1'。对于我的用例,我需要 LimitOffsetPagination。

标签: django django-rest-framework pagination


【解决方案1】:

如果您没有设置default_limit 并调用/jobs,它将正常显示结果。对于LimitOffsetPagination,您需要在请求中指定限制和偏移量,或者指定default_limit 以查看差异。

【讨论】:

    【解决方案2】:

    试着用下面的代码替换你的分页类

    from rest_framework.pagination import PageNumberPagination
    class CustomPagination(PageNumberPagination):
        page_size = 5
        page_size_query_param = 'page_size'
    

    【讨论】:

    • 他们要求一种方法来启用不依赖于 Django 设置的分页,请参阅最后一段。
    • 检查我编辑的答案。
    【解决方案3】:

    您的StandardResultsSetPagination 是否继承了正确的分页样式? LimitOffsetPagination 默认不限制输出(PAGE_SIZE 设置除外),需要查询参数来设置限制。它也没有page_size 类属性,与PageNumberPagination 相反。

    【讨论】:

    • 问题是我一开始尝试了PageNumberPagination,它改变了输出。我加快了 LimitOffsetPagination 的工作。但在那种情况下,我不得不使用 'jobs/?limit=2&offset=1' 来查看差异。对于我的用例,我需要 LimitOffsetPagination。
    • 在这种情况下,您应该能够将page_size 类属性替换为default_limit。您可能还想查看max_limit 的用例。
    • 好主意。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-03-09
    • 2019-09-15
    • 2021-02-09
    相关资源
    最近更新 更多