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)