分两步:
1、创建自定义分页器
2、在视图类中使用
1、创建分页器:
# -*- coding: utf-8 -*- # @Time : 2021/5/6 15:20 # @File : DRF_Paginate.py # @Software: PyCharm from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response import math class CustomPagination(PageNumberPagination): """ 自定义分页器类 """ # 用来控制每页显示多少条数据(全局参数名为PAGE_SIZE,全局为默认值); page_size = 3 # 用来提供直接访问某页的数据; page_query_param = 'page' # 控制page_size_query_param参数能调整的最大条数 max_page_size = 10000 # 前端临时调整当前显示多少条数据,此项优先级最高(url传递的page_size > 自定义分页器的page_size属性值 > settings.py中配置的默认值) page_size_query_param = 'page_size' def get_paginated_response(self, data): """ 重写该方法,以满足前端格式 :param data: :return: """ return Response({ 'links': { 'next': self.get_next_link(), 'previous': self.get_previous_link() }, 'total': self.page.paginator.count, # 页码总数 'pages': math.ceil(self.page.paginator.count/int(self.request.query_params['page_size'])), 'rows': data })
注意:实际中可以不要pages总页数,如果前端url没有传递page_size参数,则self.request.query_params['page_size']会报错
2、在视图类中使用分页器:
class ListSubSys(generics.ListAPIView): """ 获取子系统列表 """ queryset = SubSys.objects.all() serializer_class = SubSysSerializers # 使用自定义分页 pagination_class = CustomPagination
全局配置在settings.py中
REST_FRAMEWORK = { # 自定义分页器类 'DEFAULT_PAGINATION_CLASS': 'common.DRF_Paginate.CustomPagination', 'PAGE_SIZE': 2, # 每页数目 }
如果某个接口(如下拉列表,不需要分页直接返回全部数据)不想使用分页器,则将设置属性 pagination_class = None,如下:
class ListSubSys(generics.ListAPIView): """ 获取子系统列表 """ queryset = SubSys.objects.all() serializer_class = SubSysSerializers # 使用自定义分页 pagination_class = None