Django: DRF自定义分页器

分两步:

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

 

posted @ 2021-05-06 17:48  秋寻草  阅读(713)  评论(0编辑  收藏  举报