• Django 之 rest_framework 分页器使用


    Django rest_framework 之分页器使用以及其源码分析

    三种分页方式:

    • 常规分页 -->PageNumberPagination
    • 偏移分页 -->LimitOffsetPagination
    • cursor游标方式 -->CursorPagination

    1.常规分页方式:

    路由

    # 路由
    url(r'^books/', views.Book.as_view({'get':'get_all'}))
    
    # 模块导入
    from rest_framework.pagination import PageNumberPagination,CursorPagination,
    LimitOffsetPagination
    
    # PageNumberPagination  常规分页
    # LimitOffsetPagination  偏移分页
    # CursorPagination  游标分页
    
    class Book(ViewSetMixin, APIView):
        def get_all(self, request):
            response = {'status': 100, 'msg': '查询成功'}
            book_list = models.Book.objects.all()
            # 实例化产生一个分页对象
            # 不继承来修改对象的值
            page=PageNumberPagination()
            page.page_size=2   # 每页显示的个数
            page.page_query_param='pag'    # 路由中?后面的key,指定页码
            page.page_size_query_param = 'size'   # 指定当前页显示多少条
            page.max_page_size = 5  # 每页最多显示多少条
            # 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象
            page_list = page.paginate_queryset(book_list, request, self)
            # 再序列化的时候,用分页之后的数据
            ser = mySer.BookSerializer(instance=page_list, many=True)
            # 会带着链接,和总共的条数(不建议用,会把总数据条数返回)
            # return page.get_paginated_response(ser.data)
            return Response(ser.data)
        
    
    REST_FRAMEWORK = {
        # 每页显示两条
        'PAGE_SIZE':2
    }
    

    2.偏移分页(LimitOffsetPagination)

    from rest_framework.pagination import LimitOffsetPagination
    
    class Book(ViewSetMixin, APIView):
        def get_all(self, request):
            response = {'status': 100, 'msg': '查询成功'}
            book_list = models.Book.objects.all()
            # 实例化产生一个偏移分页对象
            page=LimitOffsetPagination()
            page.default_limit = 3   # 每页显示的条数 
            page.offset_query_param = 'offset'     # 从哪一页开始的标杆的key,如 offset=3
            page.limit_query_param = 'limit'    # 往后偏移多少的key值,如 limit=4
            page.max_limit = 5      # 每页显示最大的条数 
            page_list = page.paginate_queryset(book_list, request, self)
            ser = mySer.BookSerializer(instance=page_list, many=True)
            return Response(ser.data)
    

    3、游标分页(CursorPagination)

    http://127.0.0.1:8000/books/?cursor=cj0xJnA9MTA%3D
    from rest_framework.pagination import CursorPagination
    
    
    class Book(ViewSetMixin, APIView):
        def get_all(self, request):
            book_list = models.Book.objects.all()
            # 实例化产生一个加密分页对象
            page = CursorPagination()
            page.page_size = 3  # 每页显示多少条
            page.ordering = 'nid'  # 按nid排序
            page.cursor_query_param = 'cursor'  # 查询的key值
            page_list = page.paginate_queryset(book_list, request, self)
            ser = mySer.BookSerializer(instance=page_list, many=True)
            return page.get_paginated_response(ser.data)
    

    分页器总结

    -分页
    		1 常规分页
    			-基本使用:
    				-page=PageNumberPagination实例化产生对象
    				-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
    				-再序列化,序列化该返回值
    			-四个参数
    				#每页显示多少条
    				page.page_size=3
    				#查询指定查询哪一页的key值
    				page.page_query_param='xxx'
    			
    				#前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
    				page.page_size_query_param='size'
    				#控制每页最大显示多少,size如果传100,最多也是显示10
    				page.max_page_size=10
    		2 偏移分页
    			-基本使用:
    				-page=LimitOffsetPagination实例化产生对象
    				-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
    				-再序列化,序列化该返回值
    		
    			-四个参数:
    				#从标杆位置往后取几个,默认取3个,我可以指定
    				page.default_limit=3
    				#每次取得条数
    				page.limit_query_param='limit'
    				#标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
    				page.offset_query_param='offset'
    				#最大取10条
    				page.max_limit=10
    		3 cursor游标方式
    			-基本使用:
    				-page=CursorPagination实例化产生对象
    				-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
    				-再序列化,序列化该返回值
    			
    			-三个参数:
    				#每页显示的大小
    				page.page_size=3
    				#查询的key值
    				page.cursor_query_param='cursor'
    				# 按什么排序
    				page.ordering='id'
    		-注意:get_paginated_response:调用这个方法返回的数据中会有总条数,上一页地址,下一页地址
    
  • 相关阅读:
    python初识面向对象
    python装饰器
    python递归函数及二分法查找
    python内置函数及匿名函数
    生成器和生成器函数以及各种推导式
    第一类对象 函数名 变量名
    初识函数
    文件操作
    基本数据类型补充 深浅拷贝
    Python小程序练习及认识小数据池和编码
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/11146539.html
Copyright © 2020-2023  润新知