普通分页
效果: 地址栏输入http://127.0.0.1:8000/book/?num=2&size=3
查看第二页, 显示三条数据, 返回的是第4,5,6条数据
from rest_framework.viewsets import ViewSetMixin
from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from app01 import models
from app01 import mySer
class Book(ViewSetMixin, APIView):
def get_all(self, request):
book_list = models.Book.objects.all() # 查询所有数据
page = PageNumberPagination() # 生成分页器对象
page.page_size = 2 # 设置每页的条数
page.page_query_param = 'num' # url中查询第几页的key默认为'page
page.page_size_query_param = 'size' # url中这一页数据的条数的key, 默认为None
page.max_page_size = 5 # 每页的最大数据条数
page_list = page.paginate_queryset(book_list, request, self) # 生成这一页的数据列表
ret = mySer.BookSerializer(page_list, many=True) # 将这一页的数据列表序列化
# return Response(ret.data) # 返回查到的数据列表
return page.get_paginated_response(ret.data) # 额外返回数据库中数据的总条数与上一页下一页的url
偏移分页
效果: 地址栏输入http://127.0.0.1:8000/book/?offset=4&limit=3
从第4条数据开始, 查看往后的3条数据
代码只需要将上面的Book类中的中间部分代码替换掉
from rest_framework.pagination import LimitOffsetPagination
page = LimitOffsetPagination() # 生成分页器对象
page.default_limit = 2 # 设置每页的条数
page.offset_query_param = 'offset' # 标杆值
page.limit_query_param = 'limit' # 往后偏移多少
page.max_limit = 5 # 每页显示最大的条数
加密分页(老刘自己取得名字)
只能上下翻页, 不能实现指定页码跳转
原理, 记住当前页的首尾两条数据的 nid (page.ordering指定的那个),
到上一页就是小于首条数据的id取几条数据,
到下一页就是大于首条数据的id取几条数据,
所以翻页的时候不会去数据库重新查一次,
效率最高
from rest_framework.pagination import CursorPagination
page = CursorPagination() # 生成分页器对象
page.ordering = 'nid' # 按nid排序
page.cursor_query_param = 'cursor' # 查询的key值
page.page_size = 3 # 每页显示多少条
注意注意注意,这里需要
return page.get_paginated_response(ret.data)
因为页码是加密的, 所以需要返回上下页的链接
url示例:
刚进来: http://127.0.0.1:8000/book/
下一页: http://127.0.0.1:8000/book/?cursor=cD0z
上一页: http://127.0.0.1:8000/book/?cursor=cj0xJnA9MTA%3D"