rest_framework之分页器

2018-12-18  本文已影响0人  aq_wzj

普通分页

效果: 地址栏输入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"
上一篇 下一篇

猜你喜欢

热点阅读