DRF內置分頁器及自定義分頁類


分頁Pagination

REST framework提供了分頁的支持。

全局配置

我們可以在 settings.py 配置文件中設置全局的分頁方式,如:

REST_FRAMEWORK = {
    ...
  # 全局分頁,一旦設置了全局分頁,那么我們drf中的視圖擴展類里面的list方法提供的列表頁都會產生分頁的效果。所以一般不用全局分頁
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    
    'PAGE_SIZE': 2  # 每頁顯示兩條數據
    
    ...
}

局部配置

也可通過自定義Pagination類,來為視圖添加不同分頁行為。在視圖中通過pagination_class屬性來指明。

from rest_framework.pagination import PageNumberPagination


# 自定義分頁類
class LargeResultsSetPagination(PageNumberPagination):
    # 默認每頁顯示10條數據
    page_size = 10
    
    # 根據'page_size'關鍵字自定義每頁顯示多少條數據
    page_size_query_param = 'page_size'
    
    # 自定義'pag'關鍵字查詢具體某一頁的數據(默認為'page')
    # 如:?pag=3 即查詢第三頁的數據
    page_query_param = 'pag'
    
    # 每頁最多顯示15條數據
    # 克制 ?page_size=20,這樣自定義無效,每頁最多顯示15條數據
    max_page_size = 15
    
    
    
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    
    # 聲明自定義的分頁配置類
    pagination_class = LargeResultsSetPagination

注意:如果在視圖內關閉分頁功能,只需在視圖內設置

pagination_class = None

可選分頁器

1) PageNumberPagination

前端訪問網址形式:

GET  http://127.0.0.1:8000/students/?page=4

可以在子類中定義的屬性:

  • page_size 每頁數目
  • page_query_param 前端發送的頁數關鍵字名,默認為"page"
  • page_size_query_param 前端發送的每頁數目關鍵字名,默認為None
  • max_page_size 前端最多能設置的每頁數量
# 聲明分頁的配置類
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
    # 默認每頁顯示10條數據
    page_size = 10
    
    # 根據'page_size'關鍵字自定義每頁顯示多少條數據
    page_size_query_param = 'page_size'
    
    # 自定義'pag'關鍵字查詢具體某一頁的數據(默認為'page')
    # 如:?pag=3 即查詢第三頁的數據
    page_query_param = 'pag'
    
    # 每頁最多顯示15條數據
    # 克制 ?page_size=20,這樣自定義無效,每頁最多顯示15條數據
    max_page_size = 15
    
    
class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/four/students/?pag=1&page_size=5

2)LimitOffsetPagination

前端訪問網址形式:#其實就是通過偏移量來取數據

GET http://127.0.0.1/four/students/?limit=100&offset=400  #從下標為400的記錄開始,取100條記錄

可以在子類中定義的屬性:

  • default_limit 默認限制,每頁數據量大小,默認值與PAGE_SIZE設置一致
  • limit_query_param limit參數名,默認'limit' , 可以通過這個參數來改名字
  • offset_query_param offset參數名,默認'offset' ,可以通過這個參數來改名字
  • max_limit 最大limit限制,默認None, 無限制
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默認每一頁查詢的數據量,類似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 調用頁碼分頁類
    # pagination_class = StandardPageNumberPagination
    # 調用查詢偏移分頁類
    pagination_class = StandardLimitOffsetPagination


免責聲明!

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



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