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

Djiango rest  framework  分页

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

第一种分页  PageNumberPagination  

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

咱们能够在配置中指定每页显示多少条数据,还有在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配置每页显示多少条数据url

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

 

添加路由spa

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

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

自定义分页PageNumberPagination  

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

#自定义分页类
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)

 

 

相关文章
相关标签/搜索