DRF的分頁

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)
視圖
相關文章
相關標籤/搜索