python - 如何使用页码创建自定义分页类?
问题描述
我正在尝试创建一个自定义分页类。这是我的尝试:
class CustomPagination(PageNumberPagination):
page_item_count = 10
page = 1
def get_paginated_response(self, data):
page = self.page
next_page = None
previous_page = None
if page.has_next():
next_page = page.next_page_number()
if page.has_previous():
previous_page = page.previous_page_number()
return Response({
"page_count": page.count,
"result_count": len(data),
"next": next_page,
"previous": previous_page,
"has_next_page": page.has_next(),
"has_previous_page": page.has_previous(),
"result": data,
})
这段代码现在不能正常工作,这不是我想要的。
我想将查询集参数作为 page_item_count 和 page。
我想返回类似的东西:
return Response({
"page_count": page.count, # Page count. i.e. there are 100 items, and we show 10 per page, then it must be 10.
"result_count": len(data), # object count. i.e. 100
"next": next_page, # Next page number. It's a number like 2,3,4,5... Not a link
"previous": previous_page, # Prev page number, like 2,3,....
"has_next_page": page.has_next(), # boolean
"has_previous_page": page.has_previous(), # boolean
"result": data, # objects to be returned
})
我怎样才能做到这一点?
解决方案
您不需要为 DRF 分页属性使用不同的名称:
class CustomPagination(PageNumberPagination):
page_size = 100 # this is equivalent to your 'page_item_count'
page_size_query_param = 'page_item_count' # this sets the param name for the page size
max_page_size = 1000
要覆盖分页响应,您可以:
def get_paginated_response(self, data):
"""
PageNumberPagination response override
"""
return Response(OrderedDict([
('page_count', self.get_page_size(self.request)), # total # on current page
('page_number', int(self.request.query_params.get(self.page_query_param, 1))),
('result_count', self.page.paginator.count), # total # of objects that will be paginated
('next', self.get_next_link()),
('previous', self.get_previous_link()),
('results', data)
]))
您实际上不需要在响应中添加布尔字段来检查它是否有下一页,因为next
andprevious
字段就足够了。
推荐阅读
- fastapi - Python Fastapi。重定向后没有标题
- arduino - 使用 IFTTT 和 Arduino 物联网云
- r - 跨多个栅格层计算每个像素的分位数概率 0.05
- unix - 将 *nix 命令的结果通过管道传输到 Vim 的打开文件集中
- sql - 在 postgresql 中更新具有行号的表
- nginx - 如何使用 fastcgi_wrap 配置 Nginx?
- javascript - Alpine.js:如何使 ref 元素可见并专注于点击?
- .htaccess - 我无法使用 .htaccess 美化我网站的 URL
- r - 将类 4 转换为 R 中的数据框
- reactjs - 输入类型日期不更新 React