資料量比較小的時候建議一次性返回資料在前端進行分頁,資料量龐大的話建議伺服器分頁單次請求單次返回
# ListModelMixin原始碼 如果是常規view要實現分頁,在檢視中實現下述程式碼即可
class ListModelMixin:
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
# self.paginate_queryset對原有的queryset資料集進行分頁
page = self.paginate_queryset(queryset)
# 如果頁號不為空
if page is not None:
#返回對應頁的資料
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 如果頁號為空則返回全部資料
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
REST_FRAMEWORK = {
# drf的分頁類位於rest_framework.pagination中
"DEFAULT_PAGINATION_CLASS":"",# 全域性預設的指定分頁類,如果檢視想單獨指定,與許可權一樣在view中單獨設定
"PAGE_SIZE": #每一頁顯示多少資料
}
# settings.py
REST_FRAMEWORK = {
# 指定分頁類為PageNumberPagination
"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
"PAGE_SIZE":3 #每一頁顯示3條資料
}
from rest_framework import pagination
# 繼承分頁類
class PublicPagination(pagination.PageNumberPagination):
page_size = 2 # 每頁顯示的預設資料個數
page_query_param = 'page' # 頁號,第幾頁的引數 ,比如定義為pages,那麼請求分頁的引數就應該是pages
page_size_query_param = 'page_size' # 自己指定每頁顯示多少個數
max_page_size = 100 # 最大允許設定的每頁顯示的數量
# last_page_strings用於指定表示請求最後一頁的引數
# page=last的時候會直接到最後一頁
# 如果不改引數的話,可以不用設定,不設定的話預設引數就是last
last_page_strings = 'last'
'''
自定義分頁類
通過page_size指定預設的每頁資料量,
page_size_query_param指定每頁自定義的資料量的引數,如果請求page_size=4,則每頁顯示4個,否則走預設的2
max_page_size是允許設定的每頁最大的資料量
'''
# 匯入自定義的分頁類
from .pagination import PublicPagination
class CategoryViewSet(ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
# 指定自定義的分頁類,與許可權、限量等不同,每個檢視只允許指定一個分頁類
# 對指定檢視設定分頁類,會覆蓋settings中預設的全域性設定
pagination_class = PublicPagination
#view
class CategoryViewSet(ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
# 給該指定LimitOffsetPagination分頁類,也可以在settings指定全域性
pagination_class = LimitOffsetPagination
# 繼承LimitOffsetPagination分頁類
class PublicLimitOffsetPagination(pagination.LimitOffsetPagination):
default_limit = 2 # 用於指定預設的limit數量
limit_query_param = 'lm' # 指定請求時候對應的limit引數名,如果是lm那麼傳參就是lm=
offset_query_param = 'of' ## 指定請求時候對應的offset引數名,如果是lm那麼傳參就是of=
max_limit = 4 # 最大的limit可設定數量
#settings設定
REST_FRAMEWORK = {
# 指定CursorPagination分頁類
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.CursorPagination",
"PAGE_SIZE": 2 # 每一頁顯示3條資料
}
#繼承CursorPagination分頁類
class PublicCursorPagination(pagination.CursorPagination):
ordering = '-created' #通過什麼進行排序,預設created
page_size = 3 # 每頁資料量
cursor_query_param = 'cs' #請求的引數欄位,預設cursor