drf内置了三种分页器
PageNumberPagination:普通分页(用的最多)
LimitOffsetPagination:偏移分页(用的第二多)
CursorPagination:游标分页(在数据类很大情况下使用,因为使用游标,所以查询最快,但是只能查当前页的前后各一页)
三个基类的位置
from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.pagination import CursorPagination
分页模式有两种APIView和GenericAPIView+ListModelMixin,当视图继承APIView,需要自己重写get,post等方法,写法有所不同
GenericAPIView+ListModelMixin的分页模式:
1.PageNumberPagination
PageNumberPagination:普通分页(用的最多)
# 在默认中的类中,四个属性的默认设置
page_size = api_settings.PAGE_SIZE # 每页显示多少条
page_query_param = 'page' # 查询参数
page_size_query_param = size # 查询的时候指定每页显示多少条
max_page_size = 10 # 每页最多显示多少条
# 使用方式:
-定义一个类,继承PageNumberPagination,重写四个属性
class MyPageNumberPagination(PageNumberPagination):
page_size = 3
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
-查询
http://127.0.0.1:8000/students/?page=1&size=5
2.LimitOffsetPagination
LimitOffsetPagination:偏移分页
-default_limit = api_settings.PAGE_SIZE # 默认条数
-limit_query_param = 'limit' # 查询时,指定查询多少条
-offset_query_param = 'offset' # 查询时,指定的起始位置是哪
-max_limit = None # 查询时,最多返回多少条
# 使用方式:
-定义一个类,继承LimitOffsetPagination,重写四个属性
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2 # 默认条数
limit_query_param = 'limit' # 查询时,指定查询多少条
offset_query_param = 'offset' # 查询时,指定的起始位置是哪
max_limit = 5 # 查询时,最多返回多少条
-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
-查询
http://127.0.0.1:8000/students/?limit=100&offset=1
3.CursorPagination
CursorPagination:游标分页(速度块)
-cursor_query_param = 'cursor' # 查询的时候,指定的查询方式
-page_size = api_settings.PAGE_SIZE # 每页显示多少条
-ordering = '-created' # 排序方式
-page_size_query_param = size # 查询的时候指定每页显示多少条
-max_page_size = None #每页最多显示多少条
# 使用方式:
-定义一个类,CursorPagination,重写四个属性
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询的时候,指定的查询方式
page_size = 2 # 每页显示多少条
ordering = 'id' # 排序方式,一定要指定排序方式,就是model中的可以排序的字段
page_size_query_param=size
max_page_size=10
-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyCursorPagination
-查询
http://127.0.0.1:8000/students/ # 啥都不加,因为只能上一页或者下一页,无法指定第几页
APIView的分页模式
-新建一个类,继承普通分页,重写四个属性
-视图类写法如下
class StudentApiView(APIView):
def get(self,request):
student_list=Student.objects.all()
page=MyPageNumberPagination()# 实例化得到对象
# 只需要换不同的分页类即可
res=page.paginate_queryset(student_list,request,self)# 开始分页
ser=StudentSerializer(res,many=True)
return page.get_paginated_response(ser.data) # 返回数据