Django REST Framework提供了三種分頁器:python
說明:通常在分頁前,須要先將數據排序。若是不排序,會報警告數據庫
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.pypost
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
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.pyspa
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
遊標分頁。有時候,別人可以根據你的請求參數推斷出你的數據庫中有多少條數據,有些公司以爲這不夠安全。使用次分頁方式能夠將遊標進行加密,令人沒法獲知數據的數目。rest
特色:對象
utils/pagination.pyblog
class CurPagination(CursorPagination): '''遊標分頁''' cursor_query_param = "cursor" # 遊標請求參數,至關於page頁數,但該數據是加密的,來自於上次分頁返回 page_size = 2 # 默認每頁顯示的 ordering = "-id" # 排序 根據id倒序 max_page_size = 10 # 每頁顯示的最大條數
views.py排序
同上☝