2016-03-02 175 views
2

我在Django Rest Framework的分页类中遇到问题。Django Rest Framework的分页给出的页面大小小于

版本:

  • 的Django 1.9.2
  • Django的REST框架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个。什么可能是这种行为的原因?我无法修复它,所以我要求你的帮助。

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

回答

4

问题是page_size_query_param = 'page'。这里你说的是该页面的尺寸应该是page。因此,与?page=2一个网址给你的2

一个page_size你需要的是page_query_param。但它的默认值是page,所以如果你删除这条线,一切都应该工作。

+0

是的,我还以为是像page_query_param。感谢您的回答,我在阅读文档时一定会错过它。 –

+0

有一个问题。为什么你使用CustomPagination?使用DEFAULT_PAGINATION_CLASS将会给你一个page_size = 10。 – ilse2005

+1

这只是举例,我有几个查询有不同的页面大小。我现在没有,我可以动态改变page_size,直到现在:) –

0

在代码中的另一个问题是:

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

应该是:

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