Django Rest Framework的分页提供的页面大小更少

时间:2016-03-02 20:01:33

标签: python django pagination django-rest-framework

我遇到了Django Rest Framework的Pagination类问题。

版本:

  • Django 1.9.2
  • Django Rest Framework 3.3.2

这是我的自定义分页类。

pagination.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个。这种行为可能是什么原因?我无法解决它,所以我在寻求你的帮助。

不是:在第一个网址中,我不添加页码。下一个网址是直接?page = 2。所以我猜它没有使用?page = 1但是当我发出请求?page = 1时它只给出了1个模型。

2 个答案:

答案 0 :(得分:4)

问题是page_size_query_param = 'page'。在这里,您说该页面的大小应为page。因此,使用?page=2的网址会为您提供page_size为2.

你想要的是page_query_param。但它的默认值是page,所以如果删除这一行,一切都应该有效。

答案 1 :(得分:0)

代码中的另一个问题是:

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

应该是:

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