【问题标题】:DRF pagination_class not returning paginating resultsDRF pagination_class 不返回分页结果
【发布时间】:2016-07-25 03:35:36
【问题描述】:

我正在尝试对 ViewSet 的结果进行分页,但无法获得对数据进行分页的响应。

当我设置全局分页时,它可以正常工作,但是我不想这样做并覆盖来自GenericAPIView 的所有视图/视图集,因为我只想对一个类进行分页。

"""
don't want to do this, but this works showing that my view is based off of `GenericAPIView`.

# settings.py 
"""
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination'
}

当我删除默认设置时,此视图会丢失分页结果

# views.py
from rest_framework.viewsets import ModelViewSet

class ClipViewSet(ModelViewSet):
    serializer_class = ClipSerializer
    queryset = Clip.objects.all()
    pagination_class = PageNumberPagination

docs 中的所有迹象来看,这应该是完全可能的,我不确定为什么在我的项目中它不起作用。我正在使用 django 1.9.7 和 DRF 3.4.0

【问题讨论】:

  • 您使用的page_size 是否正确?尝试在您的视图中将其设置为较小的值并尝试一下。
  • 是的,目前有 11 个结果,我已将 page_size 设置为 5,但它不会分页(除非我在设置中设置默认值)
  • 对我来说似乎是一个错误。你可以在 DRF 的 github repo 中打开一个问题。
  • @SudipKafle 我得出了同样的结论,已经发布了我们会看看他们怎么说github.com/tomchristie/django-rest-framework/issues/4304

标签: django django-rest-framework


【解决方案1】:

这不是错误。正如您在source code 中看到的,PageNumberPagination 的默认页面大小为None,这意味着即使您明确指定了分页器类,分页也被禁用。

您需要使用所需的 page_size 子类化 PageNumberPagination 才能激活分页:

class MyPageNumberPagination(PageNumberPagination):
    page_size = 5

class ClipViewSet(ModelViewSet):
    pagination_class = MyPageNumberPagination

请注意,您需要在分页器类上设置page_size,而不是在视图上。

或者将页面大小放在全局设置中:

REST_FRAMEWORK = {
    'PAGE_SIZE': 5
}

那你可以直接使用PageNumberPagination

【讨论】:

  • 我认为这是一个错误,或者至少是一个文档问题,如果他们不希望您能够在不同的视图上选择不同的页面大小。但是,是的,我得出了相同的结论,并且它更多地转移到了 github 问题而不是 stackoverflow 的范围内。对于其他调查此问题的人 - github.com/tomchristie/django-rest-framework/issues/4304
  • 你可以为不同的视图使用不同的页面大小,你只需要使用 PageNumberPagination 的不同子类和你想要的页面大小(如the docs 中所述)。但我同意这不是一个非常直观和方便的设计恕我直言。
  • 这最终成为了 tom 今天早上在 master 中更新的文档的问题(从未说过需要 PAGE_SIZE 设置才能在视图上使用 pagination_class),这就是让我失望的原因这条混乱之路。
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2020-08-30
相关资源
最近更新 更多