• Django rest framework(7)----分页


    Djiango rest  framework  分页

    rest framework 为我们提供了3种分页:  1 PageNumberPagination  2  LimitOffsetPagination  3  CursorPagination

    第一种分页  PageNumberPagination  

    这是一种我们比较常见的分页,就是显示第几页,一页显示多少条数据

    我们可以在配置中指定每页显示多少条数据,还有在url 中指定参数page = 可以显示多少页

    序列化表  api/utils/serializers/pager.py 

    from rest_framework import serializers
    from api import models
    
    
    class PagerSerialiser(serializers.ModelSerializer):
        class Meta:
            model = models.Role
            fields = "__all__"

    分页的类视图函数代码

    from api.utils.serializsers.pager import PagerSerialiser
    from rest_framework.response import Response
    from rest_framework.pagination import PageNumberPagination
    
    
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #获取所有数据
            roles = models.Role.objects.all()
            #创建分页对象
            pg = PageNumberPagination()
            #获取分页的数据
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #对数据进行序列化
            ser = PagerSerialiser(instance=page_roles,many=True)
            return Response(ser.data)

    settings配置每页显示多少条数据

    REST_FRAMEWORK = {
        #分页
        "PAGE_SIZE":2   #每页显示多少个
    }

    添加路由

    urlpatterns = [
        url('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),)    #分页1
    ]

     在这里我通过url中的参数page 我指定显示第二页的数据

    自定义分页PageNumberPagination  

    主要是通过继承 PageNumberPagination  改变其内部显示的每页最大值 默认每页显示的数量 每页显示多少个

    #自定义分页类
    class MyPageNumberPagination(PageNumberPagination):
        #每页显示多少个
        page_size = 3
        #默认每页显示3个,可以通过传入pager1/?page=2&size=4,改变默认每页显示的个数
        page_size_query_param = "size"
        #最大页数不超过10
        max_page_size = 10
        #获取页码数的
        page_query_param = "page"
    
    
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #获取所有数据
            roles = models.Role.objects.all()
            #创建分页对象,这里是自定义的MyPageNumberPagination
            pg = MyPageNumberPagination()
            #获取分页的数据
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #对数据进行序列化
            ser = PagerSerialiser(instance=page_roles,many=True)
            return Response(ser.data)

    测试结果如下

    第二种分页   LimitOffsetPagination

     这是一种可以做到从什么位置开始向后取多少数量的分页

    自定义

    在这里我定义的是每页显示2条数据,每页最多显示的个数是10个

    #自定义分页类2
    class MyLimitOffsetPagination(LimitOffsetPagination):
        #默认显示的个数
        default_limit = 2
        #当前的位置
        offset_query_param = "offset"
        #通过limit改变默认显示的个数
        limit_query_param = "limit"
        #一页最多显示的个数
        max_limit = 10
    
    
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #获取所有数据
            roles = models.Role.objects.all()
            #创建分页对象
            pg = MyLimitOffsetPagination()
            #获取分页的数据
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #对数据进行序列化
            ser = PagerSerialiser(instance=page_roles,many=True)
            return Response(ser.data)

     测试结果如下:

     我想要显示第3个后面的1条数据

    http://127.0.0.1:8000/api/v1/pager1/?offset=3&limit=1 

     

    返回的时候可以用get_paginated_response方法  自带上一页下一页

    只需要返回的时候使用分页自带的  get_paginated_response 即可

    测试的结果如下

    第三种分页 CursorPagination

    这是一种对页数加密的分页,主要是用来解决数据量比较大的时候,越往后查看页数,数据量扫描的数量就比较大,查询的速度也就比较大,主要的特点是限制页面大幅度跳转的情况比如一开始是第一页通过用户url 直接翻到100页,在这里对页数进行了加密,在这里它的内部为了加快查询记录了id的最大值和最小值  

     加密分页方式,只能通过点“上一页”和下一页访问数据

    #自定义分页类3 (加密分页)
    class MyCursorPagination(CursorPagination):
        cursor_query_param = "cursor"
        page_size = 2     #每页显示2个数据
        ordering = 'id'   #排序
        page_size_query_param = None
        max_page_size = None
    
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #获取所有数据
            roles = models.Role.objects.all()
            #创建分页对象
            pg = MyCursorPagination()
            #获取分页的数据
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #对数据进行序列化
            ser = PagerSerialiser(instance=page_roles,many=True)
            # return Response(ser.data)
            return pg.get_paginated_response(ser.data)

     

  • 相关阅读:
    Github创建远程库
    注册和登录Github
    Github简介
    一个成都程序猿写于离开北京一周年与26岁生日的这一天。
    【原创】面试时遇到『看门狗』脖子上挂着『时间轮』,我就问你怕不怕?
    【编程玄学】一个困扰我122天的技术问题,我好像知道答案了。
    【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。
    【原创】面试官:你回去等通知吧!
    【原创】面试官问我G1回收器怎么知道你是什么时候的垃圾?
    【原创】面试官:你说你熟悉jvm?那你讲一下并发的可达性分析
  • 原文地址:https://www.cnblogs.com/crazymagic/p/9571864.html
Copyright © 2020-2023  润新知