我遇到了Django Rest Framework的Pagination类问题。
版本:
这是我的自定义分页类。
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个模型。
答案 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',