DRF的分頁
爲何要使用分頁
其實這個不說你們都知道,你們寫項目的時候也是必定會用的,數據庫
咱們數據庫有幾千萬條數據,這些數據須要展現,咱們不可能直接從數據庫把數據所有讀取出來,ide
這樣會給內存形成特別大的壓力,有可能還會內存溢出,因此咱們但願一點一點的取,post
那展現的時候也是同樣的,老是要進行分頁顯示,咱們以前本身都寫過度頁。加密
那麼你們想一個問題,在數據量特別大的時候,咱們的分頁會越日後讀取速度越慢,spa
當有一千萬條數據,我要看最後一頁的內容的時候,怎麼能讓個人查詢速度變快。rest
DRF給咱們提供了三種分頁方式,咱們看下他們都是什麼樣的~~code
分頁組件的使用blog
DRF提供的三種分頁內存
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置get
REST_FRAMEWORK = { 'PAGE_SIZE': 2 }
第一種 PageNumberPagination 看第n頁,每頁顯示n條數據
http://127.0.0.1:8000/book?page=2&size=1

class MyPageNumber(PageNumberPagination): page_size = 2 # 每頁顯示多少條 page_size_query_param = 'size' # URL中每頁顯示條數的參數 page_query_param = 'page' # URL中頁碼的參數 max_page_size = None # 最大頁碼數限制

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)

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)
第二種 LimitOffsetPagination 在第n個位置 向後查看n條數據
http://127.0.0.1:8000/book?offset=2&limit=1

class MyLimitOffset(LimitOffsetPagination): default_limit = 1 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 999

# 視圖和上面的大致一致 # 只有用的分頁類不一樣,其餘都相同 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)
第三種 CursorPagination 加密遊標的分頁 把上一頁和下一頁的id記住

class MyCursorPagination(CursorPagination): cursor_query_param = 'cursor' page_size = 1 ordering = '-id'

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)