使用DRF的分页之前呢,先来了解下Django自带的分页功能
fromdjango.core.paginator import Paginator,Page
# 一个Page中有 object_list代表当前页的所有对象
#has_next 是不是有下一页
#has_previous 是否有上一页
#next_page_number 下一页的编号
#previous_page_number 上一页的编号
#self.number 当前页的编号
#self.paginator 当前页的分页器
# 一个Paginator中的object_list 代表所有未分页对象
#self.per_page 每一页有几个对象
#get_page(self, number): 从分页器中取第几页
#page_range(self): 返回分页列表
Django原生通过Paginator与Page对象完成了分页相关实现
一、DRF对Django的分页的封装
1、在rest_framework.pagination.py 总使用BasePagination类对响应的分类方法进行了实现,其中最主要的是paginate_queryset与get_paginated_response方法,通过类PageNumberPagination、LimitOffsetPagination、CursorPagination实现了基本的分页形式。
当然我们也可以对必要的分页实现进行重写
二、配置全局分页
在settings.py中配置全局分页器
REST_FRAMEWORK= {
# 全局配置分页
# 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.LimitOffsetPagination',
# 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
# 'PAGE_SIZE': 2,
}
在rest_framework.generics.py 中的GenericAPIView类中使用pagination_class= api_settings.DEFAULT_PAGINATION_CLASS声明了默认使用全局分页配置
三、自定义分页
fromrest_framework import pagination
classMyPagination(pagination.PageNumberPagination):
page_size = 3
page_query_param = 'p'
page_size_query_param = 'num'
四、视图中配置自定义分页
classCategoryViewSets(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerizlizer
#配置视图类使用的分页
# pagination_class = MyPagination