rest_framework之分頁器

weixin_33861800發表於2018-12-18

普通分頁

效果: 位址列輸入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"

相關文章