zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    1032. Sharing (25)
    1031. Hello World for U (20)
    1030. Travel Plan (30)
    1029. Median (25)
    1028. List Sorting (25)
    1026. Table Tennis (30)
    win10 tortoiseSVN文件夹及文件图标不显示解决方法
    qrcode.react和jquery.qrcode生成二维码
    js来获取所有屏幕适配的总结
    handsontable整理
  • 原文地址:https://www.cnblogs.com/gcgc/p/14736211.html
Copyright © 2011-2022 走看看