美文网首页
19、Django_rest framework_分页引擎

19、Django_rest framework_分页引擎

作者: 猪儿打滚 | 来源:发表于2019-12-15 17:08 被阅读0次

    常见的需求:分页返回查询到的结果

    一、pagination分页类

    使用rest framework官方的pagination分页引擎,提供了三种分页类:
    1.PageNumberPagination:根据页数进行分页
    2.LimitOffsetPagination:根据偏移量进行分页
    3.CursorPagination:根据游标进行分页

    二、PageNumberPagination:根据页数进行分页
    1.1 指定全局分页引擎
    • 1.在settting.py中,指定全局分页引擎和每页返回的条数
    REST_FRAMEWORK = {    
    "DEFAULT_RENDERER_CLASSES": (
            "rest_framework.renderers.JSONRenderer",
            "rest_framework.renderers.BrowsableAPIRenderer",
        ),
        # 设置全局过滤引擎
        'DEFAULT_FILTER_BACKENDS':[
        'rest_framework.filters.OrderingFilter',
        'django_filters.rest_framework.backends.DjangoFilterBackend'
    ],
        # 设置全局分页引擎
        'DEFAULT_PAGINATION_CLASS':[
        # 设置分页引擎
        'rest_framework.pagination.PageNumberPagination'
        # 指定每页返回的条数
        'PAGE_SIZE': 10
    ]
    }
    
    • 2.在视图类中使用分页引擎
    • 步骤:
      a.先使用过滤引擎
      b.再使用分页引擎
    • 使用之前使用了过滤引擎的获取所有project的get方法进行示例
    def get(self, request):
        # 建议调用get_queryset方法来获取查询集
        project_qs = self.get_queryset()
        # 对查询集进行过滤(使用的是上面类属性定义的过滤引擎),并覆盖,获取到的是经过排序后的查询集
        project_qs = self.filter_queryset(project_qs)
    
        ## 使用paginate_queryset进行分页,返回的是分页后的查询集(如果没有指定分页引擎,那么返回的是None)
        page = self.paginate_queryset(project_qs)
        ## 判断是否指定了分页引擎,指定了则返回分页后的数据,否则返回只经过过滤引擎处理后的数据
        if page is not None:
            serializer = self.get_serializer(instance=project_qs, many=True)
            ## 返回分页后的数据
            return self.get_paginated_response(serializer.data)
    
    
        # 建议使用get_serializer方法来获取序列化器
        serializer = self.get_serializer(instance=project_qs, many=True)
        # 响应返回;如果请求没有指定Accept,那么默认返回json
        return Response(serializer.data, status=status.HTTP_200_OK)
    
    • 3.请求该接口url
      如果不指定页数,那么默认是第一页
      http://xxx.xx.com/page==页数或者http://xxx.xx.com/?page=页数
      比如:
    # 查询name=测试的第二页数据
    http -v http://xxx/porojects/ name==测试 page=2
    http -v http://xxx/porojects/?name==测试?page=2
    
    1.2 在视图类中,指定分页引擎
    • 1.在视图类指定分页引擎
    # 1.导包
    from rest_framework.pagination import PageNumberPagination
    # 2.指定分页引擎
    pagination_class = PageNumberPaginationManual
    
    • 2.该视图类的其它代码如上面的1.1的2
    三、自定义分页类
    1.1 有这么几个需求

    1.想要自定义页数的key,不想为page,比如为currpage
    2.想要前端自己想要每页显示多少页,就自己传递值过来,并且key为pagesize

    1.2 方法:

    写一个新的类,继承PageNumberPagination类,在这个类的基础上进行修改

    1.3 步骤:
    • 在项目的util目录,创建一个名为pagination.py的文件
    • 需求如上面所述,代码如下:
    from rest_framework.pagination import PageNumberPagination
    class PageNumberPaginationManual(PageNumberPagination):
       # 当前页数的key从page修改为currpage
        page_query_param = 'currpage'
        # 默认每页显示的条数为2;page_size也是请求时的key
        page_size = 2
        # 把page_size修改为pagesize
        page_size_query_param = 'pagesize'
        # 分页的最大的page_size,每页不能显示超过50条
        max_page_size = 50
    
    • 在settting.py中,指定全局分页引擎,无需指定每页返回条数,由前端传参决定
    REST_FRAMEWORK = {    
    "DEFAULT_RENDERER_CLASSES": (
            "rest_framework.renderers.JSONRenderer",
            "rest_framework.renderers.BrowsableAPIRenderer",
        ),
        # 设置全局过滤引擎
        'DEFAULT_FILTER_BACKENDS':[
        'rest_framework.filters.OrderingFilter',
        'django_filters.rest_framework.backends.DjangoFilterBackend'
    ],
        # 设置全局分页引擎
        'DEFAULT_PAGINATION_CLASS':[
        # 设置自定义的分页引擎
        'utils.PageNumberPaginationManual'
    ]
    }
    
    • 3.请求该接口url
      注意,上面设置了每页最多只能返回50条数据,所以pagesize不能大于50
    # 查询name=测试,第二页,每页显示4条(也就是得到第5-8条)
    http -v http://xxx/porojects/?name==测试?currpage=2?pagesize=4
    

    相关文章

      网友评论

          本文标题:19、Django_rest framework_分页引擎

          本文链接:https://www.haomeiwen.com/subject/nazknctx.html