zoukankan      html  css  js  c++  java
  • 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)

     

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/crazymagic/p/9571864.html
Copyright © 2011-2022 走看看