Django REST Framework提供了三種分頁器:
- PageNumberPagination。基於Django Paginator封裝,使得操作更方便,只需要做一些配置即可。分頁方式:根據頁數和每頁的大小進行分頁。
- LimitOffsetPagination。分頁方式:從第幾條開始找,向后找多少條。
- 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.py
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.py
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
游標分頁。有時候,別人能夠根據你的請求參數推斷出你的數據庫中有多少條數據,有些公司覺得這不夠安全。使用次分頁方式可以將游標進行加密,使人無法獲知數據的數目。
特點:
- 分頁前必須要排序
- 游標加密,不允許導航到任意位置(基於前兩種的分頁可以通過傳參,對任意的頁數發起請求,游標分頁不允許),只能"next"和“prev”
- 支持非常大的數據集。如果表中有非常大的數據量,基於偏移的分頁器效率變得很低,但基於游標分頁的效率高。
utils/pagination.py
class CurPagination(CursorPagination): '''游標分頁''' cursor_query_param = "cursor" # 游標請求參數,相當於page頁數,但該數據是加密的,來自於上次分頁返回 page_size = 2 # 默認每頁顯示的 ordering = "-id" # 排序 根據id倒序 max_page_size = 10 # 每頁顯示的最大條數
views.py
同上☝