REST framework 分頁組件

REST framework提供了分頁的支持。

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

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每頁數目
}


如果在視圖內關閉分頁功能,只需在視圖內設置屬性:
pagination_class = None

自定義分頁組件:

1.創建pahenations.py文件,在其中自定義分頁類(基礎分頁類/偏移分頁類/遊標分頁類)
2.視圖類中配置自定義的分頁類: pagination_class = 自定義分頁類

基礎分頁組件

  • pahenations.py
導入PageNumberPagination類
from rest_framework.pagination import PageNumberPagination
​
繼承PageNumberPagination類
class MyPageNumberPagination(PageNumberPagination):
    # ?page=頁碼
    page_query_param = 'page'
    # ?page=頁面 下默認一頁顯示的條數
    page_size = 3
    # ?page=頁面&page_size=條數 用戶自定義一頁顯示的條數
    page_size_query_param = 'page_size'
    # 用戶自定義一頁顯示的條數最大限制:數值超過5也只顯示5條
    max_page_size = 5

屬性:

  • page_size 每頁數目
  • page_query_param 前端發送的頁數關鍵字名,默認爲"page"
  • page_size_query_param 前端發送的每頁數目關鍵字名,默認爲None
  • max_page_size 前端最多能設置的每頁數量

使用:

  • views.py
from rest_framework.generics import ListAPIView
​
class CarListAPIView(ListAPIView):
    # 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    # 分頁組件 - 給視圖類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可
    pagination_class = pagenations.MyPageNumberPagination

偏移分頁組件

  • pahenations.py
導入LimitOffsetPagination類
from rest_framework.pagination import LimitOffsetPagination

繼承LimitOffsetPagination類
class MyLimitOffsetPagination(LimitOffsetPagination):
    # ?offset=從頭偏移的條數&limit=要顯示的條數
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    
    # ?不傳offset和limit默認顯示前3條,只設置offset就是從偏移位往後再顯示3條
    default_limit = 3
    
    # ?limit可以自定義一頁顯示的最大條數
    max_limit = 5
​
    # 只使用limit結合ordering可以實現排行前幾或後幾
    # eg: ?ordering=-price&limit=2  => 價格前2

屬性:

  • default_limit 默認限制,默認值與PAGE_SIZE設置一直
  • limit_query_param limit參數名,默認'limit'
  • offset_query_param offset參數名,默認'offset'
  • max_limit 最大limit限制,默認None

使用:

  • views.py
from rest_framework.generics import ListAPIView
​
class CarListAPIView(ListAPIView):
    # 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    # 分頁組件 - 給視圖類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可
    pagination_class = pagenations.MyLimitOffsetPagination

遊標分頁組件

  • pahenations.py
注:必須基於排序規則下進行分頁
1)如果接口配置了OrderingFilter過濾器,那麼url中必須傳ordering
2)如果接口沒有配置OrderingFilter過濾器,一定要在分頁類中聲明ordering按某個字段進行默認排序
from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'
    page_size = 3
    page_size_query_param = 'page_size'
    max_page_size = 5
    ordering = '-pk'

使用:

  • views.py
from rest_framework.generics import ListAPIView
​
class CarListAPIView(ListAPIView):
    # 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    # 分頁組件 - 給視圖類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可
    pagination_class = pagenations.MyCursorPagination

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章