【问题标题】:Django Rest Framework's Pagination gives less then page sizeDjango Rest Framework 分页小于页面大小
【发布时间】:2016-06-15 21:09:25
【问题描述】:

我在使用 Django Rest Framework 的分页类时遇到问题。

版本:

  • Django 1.9.2
  • Django Rest 框架 3.3.2

这是我的自定义分页类。

分页.py:

from rest_framework import pagination
class VideoPagination(pagination.PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page'
    max_page_size = 10000

settings.py:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': ('rest_framework.pagination.PageNumberPagination',),
    'PAGE_SIZE': 10,
}

在我的 views.py 中,我有一个 ListAPIView 列出了所有视频模型,它使用了我的自定义分页器。

views.py:

class explore(ListAPIView):
    serializer_class = ExploreVideoSerializer
    pagination_class = VideoPagination

    def get_queryset(self):
        category = self.kwargs['category']
        if category == 'all':
            return Video.objects.all().order_by('-date')
        else:
            return Video.objects.filter(category=category).order_by('-date')

    def get_serializer_context(self):
        return {"request": self.request}

问题是,当我向这个视图发出请求时,在第一页它提供了 10 个项目,这正是我想要的。然后在第二页和第三页,它给出了不到 10 个项目。

例如,有 16 个视频项。在第一个请求中,它给出了前 10 个。在第二页的请求中,它给出了其中的 2 个。它还说还有另一页,并给出了另外 3 页。在第 4 页中,它给出了其中的 4 个。这种行为的原因可能是什么?我无法修复它,所以我请求您的帮助。

Not:在第一个 url 中,我没有添加页码。下一个 url 直接是 ?page=2。所以我猜它没有使用 ?page=1 但是当我请求 ?page=1 时它只提供 1 个模型。

【问题讨论】:

    标签: python django pagination django-rest-framework


    【解决方案1】:

    问题是page_size_query_param = 'page'。在这里你说页面的大小应该是page。因此,带有?page=2 的 URL 将为您提供 2 的 page_size

    你想要的是page_query_param。但它的默认值是page,所以如果你删除这行,一切都会正常。

    【讨论】:

    • 是的,我认为它就像 page_query_param。感谢您的回答,我一定是在阅读文档时错过了它。
    • 一个问题。你为什么要使用 CustomPagination 呢?使用 DEFAULT_PAGINATION_CLASS 将给你一个 page_size=10 已经。
    • 这只是一个例子,我有几个不同页面大小的查询。直到现在我才可以动态更改 page_size :)
    【解决方案2】:

    代码中的另一个问题是:

    'DEFAULT_PAGINATION_CLASS': ('rest_framework.pagination.PageNumberPagination',),
    

    应该是:

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2016-08-06
      • 2010-10-10
      • 2018-07-18
      • 2016-09-14
      • 1970-01-01
      • 2015-02-28
      • 2018-07-21
      相关资源
      最近更新 更多