Django REST Framework之分頁器


Django REST Framework提供了三種分頁器:

  1. PageNumberPagination。基於Django Paginator封裝,使得操作更方便,只需要做一些配置即可。分頁方式:根據頁數和每頁的大小進行分頁。
  2. LimitOffsetPagination。分頁方式:從第幾條開始找,向后找多少條。
  3. CursorPagination。實現比較復雜,有自己的特點。

說明:一般在分頁前,需要先將數據排序。如果不排序,會報警告

PageNumberPagination

utils/pagination.py

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    # 只需要做一些配置即可
    page_size = 1   # 每頁的數據量(默認)
    page_query_param = "page" # 請求參數中的 page參數名
    page_size_query_param = "size" # 請求參數中的 page_size參數名
    max_page_size = 3 # 每頁最大數量,請求參數中如果超過了這個配置,不會報錯,會按照此配置工作

需要說明的是:我們配置的參數名,需要使用get請求。DRF在實現過程中只是針對get獲取參數,如果需要其他方式傳遞參數(如post),需要自己修改源碼。

views.py

from utils.pagination import MyPagination

class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all().order_by("id")

        # 實例化分頁器對象
        pageObj = MyPagination()     #  PageNumberPagination
        # 調用分頁方法
        page_query = pageObj.paginate_queryset(book_list, request, view=self)
        # 序列化器 many表示取出多條數據
        ret = BookSeriallzer(page_query, myFields="__all__", many=True) 
        print(ret)
    
        resIO = pageObj.get_paginated_response(ret.data) # 獲取分頁的結果,將分頁后的結果數據與Response封裝在一起
        # 將數據分為count,next,prev,result。分別是數據總量,上一頁/下一頁的請求地址,本頁的數據

        return resIO

LimitOffsetPagination

utils.pagination.py

class LimitPagination(LimitOffsetPagination):
    '''需要我們規定:從第幾條開始找,向后找多少條limit'''

    default_limit = 1               # 向后找幾條的默認配置
    limit_query_param = "limit"     # 請求參數中的limit參數名
    offset_query_param = "offset"   # 請求參數中的offset參數名
    max_limit = 3                   # 最大的尋找條數

說明:參數的請求方法同上,get獲取。

views.py

from utils.pagination import LimitPagination

class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all().order_by("id")

        # 實例化分頁器對象
        pageObj = LimitPagination()  #  LimitOffsetPagination
        # 調用分頁方法
        page_query = pageObj.paginate_queryset(book_list, request, view=self)
        # 序列化器 many表示取出多條數據
        ret = BookSeriallzer(page_query, myFields="__all__", many=True) 
        print(ret)
    
        resIO = pageObj.get_paginated_response(ret.data) # 獲取分頁的結果,將分頁后的結果數據與Response封裝在一起
        # 將數據分為count,next,prev,result。分別是數據總量,上一頁/下一頁的請求地址,本頁的數據

        return resIO

CursorPagination

游標分頁。有時候,別人能夠根據你的請求參數推斷出你的數據庫中有多少條數據,有些公司覺得這不夠安全。使用次分頁方式可以將游標進行加密,使人無法獲知數據的數目。

特點:

  1. 分頁前必須要排序
  2. 游標加密,不允許導航到任意位置(基於前兩種的分頁可以通過傳參,對任意的頁數發起請求,游標分頁不允許),只能"next"和“prev”
  3. 支持非常大的數據集。如果表中有非常大的數據量,基於偏移的分頁器效率變得很低,但基於游標分頁的效率高。

utils/pagination.py

class CurPagination(CursorPagination):
    '''游標分頁'''
    cursor_query_param = "cursor" # 游標請求參數,相當於page頁數,但該數據是加密的,來自於上次分頁返回
    page_size = 2 # 默認每頁顯示的
    ordering = "-id" # 排序 根據id倒序
    max_page_size = 10 # 每頁顯示的最大條數

views.py

同上☝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM