Django Rest Framework --- 分页器组件

一:简单分页

简单分页就是查看第n页,每页显示n条数据

使用方法:
-1 导入PageNumberPagination类
-2 实例化产生一个对象
    -page_pagination = PageNumberPagination()
-3 需要配置四个参数:page_size,page_query_param,page_size_query_param,max_page_size
    -page_size必须指定:在setting中指定或者直接赋值
-4 调用下面的方法,返回ret数据
    ret = page_pagination.paginate_queryset(book_list, request, self)
-5 再序列化,就是序列化返回的数据,也就是ret
-类中需要掌握的几个属性
    -page_size:控制每页显示条数
    -page_query_param:控制查询第几页的查询参数,
    -比如page_query_param='xx'
    -http://127.0.0.1:8000/books/?xx=2  表示查询第二页的数据
    -page_size_query_param:控制每页最大显示的条数
    -比如page_pagination.page_size_query_param='max'
    -http://127.0.0.1:8000/books/?xx=2&max=6   表示查询第二页的数据,每页显示6条
    -max_page_size:控制每页最大显示的条数
    -比如:page_pagination.max_page_size=7
    -http://127.0.0.1:8000/books/?max=1000    最多显示7条

  使用配置文件

在settings.py中配置

REST_FRAMEWORK = {
    # 每页显示两条
    'PAGE_SIZE':2
}

  views.py

from rest_framework.pagination import PageNumberPagination

class BooksView(APIView):
    def get(self,request):
        book_list = models.Book.objects.all()
        page_pagination = PageNumberPagination()
        page_list = page_pagination.paginate_queryset(book_list,request,view=self)
        ser = BookSerializer(instance=page_list,many=True)
        print(ser.data)
        return Response(ser.data)

自定义四个参数

from rest_framework.pagination import PageNumberPagination

class BooksView(APIView):
    def get(self,request):
        #使用方法
        #1.导入PageNumberPagination类
        #2.实例化产生一个对象
            #-page_pagination = PageNumberPagination()
        #3.需要配置四个参数: page_size, page_query_param, page_size_query_param, max_page_size
            #-page_size必须指定: 在setting中指定或者直接赋值
        #4.调用下面的方法, 返回ret数据
            #-ret = page_pagination.paginate_queryset(book_list, request, self)
        # 5.再序列化,就是序列化返回的数据,也就是ret
        book_list = models.Book.objects.all()
        page_pagination = PageNumberPagination()
        #四个参数
        page_pagination.page_size = 4   #每页的条数
        page_pagination.page_query_param = 'ccc'  #控制查询第几页的查询参数,
        page_pagination.page_size_query_param = 'max'  #用户控制每页显示的条数
        page_pagination.max_page_size = 6  #每页显示的最大条数,防止用户自定义的条数太大
        page_list = page_pagination.paginate_queryset(book_list,request,view=self)
        ser = BookSerializer(instance=page_list,many=True)
        print(ser.data)
        return Response(ser.data)

二:偏移分页

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination

class BooksView(APIView):
    def get(self,request):
        #使用方法:同简单分页
        book_list = models.Book.objects.all()
        page_pagination = LimitOffsetPagination()
        page_pagination.default_limit = 5  #默认显示的每页数量,默认偏移的数量
        page_pagination.limit_query_param = 'xx'    #往后偏移多少条,默认是limit,也可以自定义
        page_pagination.offset_query_param = 'ee'   #标杆值,默认是offser,也可以自定义
        # limit_query_param + offset_query_param联合起来用:
        # -访问: http://127.0.0.1:8000/books/?limit=1&offset=5   表示: 以数据的第5条作为标杆, 往后偏移1条
        page_list = page_pagination.paginate_queryset(book_list,request,view=self)
        ser = BookSerializer(instance=page_list,many=True)
        print(ser.data)
        return Response(ser.data)

三:CursorPagination(加密分页,只能看上一页和下一页,速度快)

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

class BooksView(APIView):
    def get(self,request):
        #使用方法:同简单分页
        #重点参数:
        #page_size: 每页显示的条数
        #cursor_query_param: 不需要动
        #ordering: 按什么排序
        #通过get_paginated_response返回结果中带上一页和下一页的链接地址
        #page_pagination.get_paginated_response(book_ser.data)
        #方法的用法
        book_list = models.Book.objects.all()
        page_pagination = CursorPagination()
        page_pagination.ordering = 'id'
        page_list = page_pagination.paginate_queryset(book_list,request,view=self)
        ser = BookSerializer(instance=page_list,many=True)
        print(ser.data)
        return page_pagination.get_paginated_response(ser.data)

四:响应器(不需要改

响应回去的页面,数据格式是不同的

局部使用:在视图类中配置

   renderer_classes = [JSONRenderer,BrowsableAPIRenderer]

全局使用:在settings中配置

  'DEFAULT_RENDERER_CLASSES':( 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ),

五:url控制器

  自动生成路由:

在url.py中:

            from rest_framework import routers
            #生成一个router对象
            router=routers.DefaultRouter()
            # 两个参数,一个是匹配的路由,一个是视图中写的CBV的类
            router.register('books',views.BooksView)
            urlpatterns = [
                url(r'',include(router.urls))
            ]

六:解析器

解析器的作用:能够解析前端传递的数据格式:urlencode,formdata,json格式

默认情况下解析所有格式内置了三种解析器

            from rest_framework.parsers import JSONParser
            from rest_framework.parsers import FormParser
            from rest_framework.parsers import MultiPartParser

解析器的局部使用:

  在视图类中配置:parser_classes=[JSONParser]

全局使用:在settings.py中配置: 

            'DEFAULT_PARSER_CLASSES': (
                'rest_framework.parsers.JSONParser',
                'rest_framework.parsers.FormParser',
                'rest_framework.parsers.MultiPartParser'
            )
原文地址:https://www.cnblogs.com/liuxiaolu/p/10638190.html