Django rest_framework 之分页器使用以及其源码分析
三种分页方式:
- 常规分页 -->PageNumberPagination
- 偏移分页 -->LimitOffsetPagination
- cursor游标方式 -->CursorPagination
1.常规分页方式:
路由
# 路由
url(r'^books/', views.Book.as_view({'get':'get_all'}))
# 模块导入
from rest_framework.pagination import PageNumberPagination,CursorPagination,
LimitOffsetPagination
# PageNumberPagination 常规分页
# LimitOffsetPagination 偏移分页
# CursorPagination 游标分页
class Book(ViewSetMixin, APIView):
def get_all(self, request):
response = {'status': 100, 'msg': '查询成功'}
book_list = models.Book.objects.all()
# 实例化产生一个分页对象
# 不继承来修改对象的值
page=PageNumberPagination()
page.page_size=2 # 每页显示的个数
page.page_query_param='pag' # 路由中?后面的key,指定页码
page.page_size_query_param = 'size' # 指定当前页显示多少条
page.max_page_size = 5 # 每页最多显示多少条
# 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象
page_list = page.paginate_queryset(book_list, request, self)
# 再序列化的时候,用分页之后的数据
ser = mySer.BookSerializer(instance=page_list, many=True)
# 会带着链接,和总共的条数(不建议用,会把总数据条数返回)
# return page.get_paginated_response(ser.data)
return Response(ser.data)
REST_FRAMEWORK = {
# 每页显示两条
'PAGE_SIZE':2
}
2.偏移分页(LimitOffsetPagination)
from rest_framework.pagination import LimitOffsetPagination
class Book(ViewSetMixin, APIView):
def get_all(self, request):
response = {'status': 100, 'msg': '查询成功'}
book_list = models.Book.objects.all()
# 实例化产生一个偏移分页对象
page=LimitOffsetPagination()
page.default_limit = 3 # 每页显示的条数
page.offset_query_param = 'offset' # 从哪一页开始的标杆的key,如 offset=3
page.limit_query_param = 'limit' # 往后偏移多少的key值,如 limit=4
page.max_limit = 5 # 每页显示最大的条数
page_list = page.paginate_queryset(book_list, request, self)
ser = mySer.BookSerializer(instance=page_list, many=True)
return Response(ser.data)
3、游标分页(CursorPagination)
http://127.0.0.1:8000/books/?cursor=cj0xJnA9MTA%3D
from rest_framework.pagination import CursorPagination
class Book(ViewSetMixin, APIView):
def get_all(self, request):
book_list = models.Book.objects.all()
# 实例化产生一个加密分页对象
page = CursorPagination()
page.page_size = 3 # 每页显示多少条
page.ordering = 'nid' # 按nid排序
page.cursor_query_param = 'cursor' # 查询的key值
page_list = page.paginate_queryset(book_list, request, self)
ser = mySer.BookSerializer(instance=page_list, many=True)
return page.get_paginated_response(ser.data)
分页器总结
-分页
1 常规分页
-基本使用:
-page=PageNumberPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值
-四个参数
#每页显示多少条
page.page_size=3
#查询指定查询哪一页的key值
page.page_query_param='xxx'
#前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
page.page_size_query_param='size'
#控制每页最大显示多少,size如果传100,最多也是显示10
page.max_page_size=10
2 偏移分页
-基本使用:
-page=LimitOffsetPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值
-四个参数:
#从标杆位置往后取几个,默认取3个,我可以指定
page.default_limit=3
#每次取得条数
page.limit_query_param='limit'
#标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
page.offset_query_param='offset'
#最大取10条
page.max_limit=10
3 cursor游标方式
-基本使用:
-page=CursorPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值
-三个参数:
#每页显示的大小
page.page_size=3
#查询的key值
page.cursor_query_param='cursor'
# 按什么排序
page.ordering='id'
-注意:get_paginated_response:调用这个方法返回的数据中会有总条数,上一页地址,下一页地址