一、分页
1、第一种情况是看第几页,每页显示多少条数据:使用PageNumberPagination内置类
(1)代码:注意每页显示几条数据的page_size 参数也可以写在配置文件中
from rest_framework.pagination import PageNumberPaginationclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class MyPageNumberPagination(PageNumberPagination): # 默认每页显示几条数据 page_size = 2 # 在URL中GET数据中的key,用来修改每页显示数据数 page_size_query_param = 'size' # 定义每页显示数据的最大数 max_page_size = 5 # 在URL中GET数据的key,用来指定查看第几页的数据 page_query_param = 'page'class Pager1View(APIView): def get(self, request, *args, **kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 pg = MyPageNumberPagination() # 在数据库中获取分页的数据 # 参数queryset就是查询到的数据 # 参数request就是封装的Request对象 # 参数view就是自定义view类的对象 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 对数据进行序列化 # 参数instance就是分页之后的数据 ser = PagerSerialiser(instance=pager_roles, many=True) # 使用渲染器,后面会说到 return Response(ser.data)
(2)分页对象的get_paginated_response方法
pg.get_paginated_response(这里就传分页之后序列化的数据ser.data)
返回执行结果,页面上就会显示除了数据以外的更多信息,包括下一页的url地址
2、第二种情况是定位到某个位置,往后看几条数据:使用LimitOffsetPagination内置类
from rest_framework.response import Responsefrom rest_framework.pagination import PageNumberPagination, LimitOffsetPaginationclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class MyLimitOffsetPagination(LimitOffsetPagination): # 默认往后看2条数据 default_limit = 2 # 指定URL的GET数据中的key,用来修改往后看几条数据 limit_query_param = 'limit' # 指定URL的GET数据中的key,用来修改起始位置,表示索引 offset_query_param = 'offset' # 定义往后看的数据条数的最大值 max_limit = 5class Pager1View(APIView): def get(self, request, *args, **kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 pg = MyLimitOffsetPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 对数据进行序列化 ser = PagerSerialiser(instance=pager_roles, many=True) return Response(ser.data) # 也可以返回更多的信息,显示下一页的URL地址 # return pg.get_paginated_response(ser.data)
3、第三种情况是加密分页,不显示页码,只显示上一页和下一页,也叫游标分页,使用内置类
特点就是每一页的页码是加密的,不是简单的1,2,3之类,所以在URL中我们无法用GET数据的key来查看具体某一页的数据,这里就要用到上面说到的分页对象的get_paginated_response方法,这样在页面上就会显示出上一页和下一页的url地址了
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPaginationclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class MyCursorPagination(CursorPagination): # 指定URL的GET数据中的key,用来查看具体的某一页数据 cursor_query_param = 'cursor' # 默认每页显示几条数据 page_size = 2 # 按什么字段进行排序 # 这里就是按照id值升序排序 # 若是-id就是按照id值降序排序 ordering = 'id' # 指定URL的GET数据中的key,用来修改每页显示的数据条数 page_size_query_param = None # 指定每页显示数据条数的最大值 max_page_size = Noneclass Pager1View(APIView): def get(self, request, *args, **kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 pg = MyCursorPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 对数据进行序列化 ser = PagerSerialiser(instance=pager_roles, many=True) # 利用get_paginated_response返回上一页和下一页的url地址 return pg.get_paginated_response(ser.data)