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