rest_framework-07-分页-渲染器
rest_framework-07-分页-渲染器
渲染器的作用:序列化、友好的展示
分页
a. PageNumberPagination分页,看第n页,每页显示n条数据;上一页和下一页。
1.
2.
3.
4.
5.渲染器 先配置settings.py文件,必须有rest_framework
6.
7.效果 好看的数据
8.也可以显示json数据
9.用分页模块,settings.py先配置每页显示的数量
10.引入分页模块。
运行结果:
11.序列化分页后的数据。
运行结果:
12.传参数分页。默认显示第一页。其他页的数据怎么看?需要转参数。
13.源码,settings.py每页显示2条数据。默认为空。如果想显示更多,比如每页显示3条、10条数据.接下来自定的分类对象。
14.自定义分类对象
运行结果:默认每页2条数据,页可以传参数。每页显示3条数据。
15.最多每页显示5条数据。2-5条数据之间随意调配。
运行结果:
16.返回HttpResponse
运行结果:有上一页,下一页都做好了
b. LimitOffsetPagination索引分页,在n个位置,向后查看n条数据;
1.第二种分页类
2.类源码
3.运行结果:从索引为2的数据开始向后查询。settings.py文件配置每页显示的数量是2
4.索引从4开始,向后查询3条数据
5.自定义
c. 加密分页CursorPagination,排序。
1,源码:
2.假设一id来排序,加负号则倒序
settings.py文件不变
运行结果;
3.正序,默认第一页
运行结果:
4.假设想看第2页的数据,分页加密了,看不了。
5. 返回HttpResponse,有上一页和下一页
运行结果:有上下页的链接
优点:避免用户写太多的数字,影响性能、速度、数据查询慢。
10:源码还原。
11.自定义类
运行结果:
总结:
1. 分页 a. 分页,看第n页,每页显示n条数据; from rest_framework.pagination import PageNumberPagination class MyPageNumberPagination(PageNumberPagination): page_size = 2 page_size_query_param = 'size' max_page_size = 5 page_query_param = 'page' class Pager1View(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 # pg = MyPageNumberPagination() pg = PageNumberPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) # 对数据进行序列化 ser = PagerSerialiser(instance=pager_roles, many=True) return Response(ser.data) # return pg.get_paginated_response(ser.data) b. 分页,在n个位置,向后查看n条数据; from api.utils.serializsers.pager import PagerSerialiser from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination class MyLimitOffsetPagination(LimitOffsetPagination): default_limit = 2 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 5 class Pager1View(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 # pg = MyLimitOffsetPagination() pg = LimitOffsetPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) # 对数据进行序列化 ser = PagerSerialiser(instance=pager_roles, many=True) return Response(ser.data) # return pg.get_paginated_response(ser.data) c. 加密分页,上一页和下一页。 from api.utils.serializsers.pager import PagerSerialiser from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination class MyCursorPagination(CursorPagination): cursor_query_param = 'cursor' page_size = 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 = CursorPagination() pg = MyCursorPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) # 对数据进行序列化 ser = PagerSerialiser(instance=pager_roles, many=True) # return Response(ser.data) return pg.get_paginated_response(ser.data)