做用:數據庫有幾千萬條數據,這些數據須要展現,咱們不可能直接從數據庫把數據所有讀取出來,這樣會給內存形成特別大的壓力,有可能還會內存溢出,因此咱們但願一點一點的取,那展現的時候也是同樣的,老是要進行分頁顯示,咱們以前本身都寫過度頁。python
在數據量特別大的時候,咱們的分頁會越日後讀取速度越慢,數據庫
當有一千萬條數據,我要看最後一頁的內容的時候,怎麼能讓個人查詢速度變快。加密
DRF提供的三種分頁方式rest
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置code
REST_FRAMEWORK = { 'PAGE_SIZE': 2 }
class MyPageNumber(PageNumberPagination): page_size = 2 # 每頁顯示多少條 page_size_query_param = 'size' # URL中每頁顯示條數的參數 page_query_param = 'page' # URL中頁碼的參數 max_page_size = None # 最大頁碼數限制
view視圖對象
class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 分頁 page_obj = MyPageNumber() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) ret = BookSerializer(page_article, many=True) return Response(ret.data) # 返回帶超連接 需返回的時候用內置的響應方法 # return page_obj.get_paginated_response(ret.data)
定義類內存
class MyLimitOffset(LimitOffsetPagination): # 默認每頁顯示的數據條數 default_limit = 10 # URL中傳入的顯示數據條數的參數 limit_query_param = 'limit' # URL中傳入的數據位置的參數 offset_query_param = 'offset' # 最大每頁顯得條數 max_limit = None
視圖get
# 視圖和上面的大致一致 # 只有用的分頁類不一樣,其餘都相同 class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 分頁 page_obj = MyLimitOffset() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) ret = BookSerializer(page_article, many=True) # return Response(ret.data) # 返回帶超連接 需返回的時候用內置的響應方法 return page_obj.get_paginated_response(ret.data)
定義類it
class MyCursorPagination(CursorPagination): # URL傳入的遊標參數 cursor_query_param = 'cursor' # 默認每頁顯示的數據條數 page_size = 2 # URL傳入的每頁顯示條數的參數 page_size_query_param = 'page_size' # 每頁顯示數據最大條數 max_page_size = 1000 # 根據ID從大到小排列 ordering = "id"
視圖io
class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 實例化分頁對象,獲取數據庫中的分頁數據 page_obj = MyCursorPagination() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) # 序列化對象 ret = BookSerializer(page_article, many=True) return Response(ret.data) # 生成分頁和數據 # 返回帶超連接 需返回的時候用內置的響應方法 # return page_obj.get_paginated_response(ret.data)