三、分页
1、使用rest_framework中的分页引擎
全局配置文件中指定分页引擎DEFAULT_PAGINATION_CLASS,并且指定每页数据数量参数PAGE_SIZE;
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 3,
# 查询全部数据 def get(self, request): qs = self.get_queryset() qs=self.filter_queryset(qs) #需要调用paginate_queryset方法,需要传递序列化之后的字典或者嵌套字典的列表 page_queryset=self.paginate_queryset(qs) #如果定义了分页引擎,则使用get_paginated_response进行返回,否则默认返回不分页的全部数据 if page_queryset is not None: serializer_obj = self.get_serializer(instance=page_queryset, many=True) return self.get_paginated_response(serializer_obj.data) serializer_obj = self.get_serializer(instance=page_queryset, many=True) return Response(serializer_obj.data, status=status.HTTP_200_OK)
- 调用paginate_queryset方法,需要传递查询集对象
- 需要调用get_paginated_response方法,需要传递序列化之后的字典或者嵌套字典的列表
- 如果定义了分页引擎,则使用get_paginated_response进行返回,否则默认返回不分页的全部数
- get_paginated_response返回Response对象,在返回的数据中,添加了特定的数据
count :数据的总数量
next :下一页的链接link
previous :上一页的链接link
results :查询结果data
2、自定义分页引擎类
2.1 自定义一个分页引擎类
from rest_framework.pagination import PageNumberPagination as _PageNumberPagination class PageNumberPagination(_PageNumberPagination): # 分页关键字,来查看对应页的数据 page_query_param='p' # 每页指定展示多少条数据 page_size_query_param='s' # 设置每页数据量虽大值 max_page_size=20 # 无效页面提示信息 invalid_page_message='这是个无效页面,请检查后重新输入....'
2.2 然后再全局配置文件setting.py里替换掉自己定义的分页类
'DEFAULT_PAGINATION_CLASS':'utils.pagination.PageNumberPagination', 'PAGE_SIZE': 3,
接下来url里拼接上p=2&s=1,表示展示第二页,每页展示1条数据
当输入的页数不存在时,就会抛出自定义的无效分页的描述
3、给指定的类视图定制一个分页引擎
就需要在指定的类视图中引用我们自定义的分页引擎
3.1 导入自定义分页引擎类
from utils.pagination import PageNumberPagination
3.2 声明需要使用的分页引擎
pagination_class = PageNumberPagination
如果我们还是按照全局分页引擎来分页,是无效的
如果我们按照自定义的分页引擎来分页,是有效的