Django REST Framework之分頁器

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

  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.pypost

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.pyspa

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

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

特色:對象

  1. 分頁前必需要排序
  2. 遊標加密,不容許導航到任意位置(基於前兩種的分頁能夠經過傳參,對任意的頁數發起請求,遊標分頁不容許),只能"next"和「prev」
  3. 支持很是大的數據集。若是表中有很是大的數據量,基於偏移的分頁器效率變得很低,但基於遊標分頁的效率高。

utils/pagination.pyblog

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

views.py排序

同上☝

相關文章
相關標籤/搜索