在app下新建一个py文件
from rest_framework.pagination import PageNumberPagination, OrderedDict
from rest_framework.response import Response
# 自定义分页类
class MyPage(PageNumberPagination):
page_size = 5 # 每页数目,为空则表示禁用分页
page_size_query_param = 'page_size' # 页面大小,可以由前端传过来
# 自定义分页形式, 重写get_paginated_response方法
def get_paginated_response(self, data):
return Response(OrderedDict([
('count', self.page.paginator.count), # 总数
('page_range', list(self.page.paginator.page_range)), # 页码范围
('has_next', self.page.has_next()), # 是否有下一页
('has_prious', self.page.has_previous()), # 是否有上一页
('next_page_number', self.page.next_page_number()), # 下一页页码
('results', data) #
]))
局部分页,在视图类下导入,然后
class DataView(GenericAPIView): # 继承ListAPIView可以快速实现分页
queryset = Data.objects.all() # 查询集(必须)
serializer_class = QbSerializers # 序列化器(必须)
# 局部分页
# pagination_class = PageNumberPagination # 分页类
# PageNumberPagination.page_size_query_param = 'page_size' # 使用内置分页类必须声明这个,不声明默认禁用分页(None)
pagination_class = MyPage # 使用自定义的分页类
# 继承GenericAPIView,如果继承ListAPIView则不用写下面
def get(self, *args, **kwargs):
# 过滤结果集
queryset = self.filter_queryset(self.get_queryset())
# 获取分页对象
page = self.paginate_queryset(queryset=queryset)
if page is not None: # 分页对象存在
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 不分页,返回所有数据
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
全局分页,在settings下
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': '自定义的分页类路径',
'PAGE_SIZE': 10, # 每页的数目
}