1. 程式人生 > >DRF的分頁

DRF的分頁

DRF的分頁

為什麼要使用分頁

其實這個不說大家都知道,大家寫專案的時候也是一定會用的,

我們資料庫有幾千萬條資料,這些資料需要展示,我們不可能直接從資料庫把資料全部讀取出來,

這樣會給記憶體造成特別大的壓力,有可能還會記憶體溢位,所以我們希望一點一點的取,

那展示的時候也是一樣的,總是要進行分頁顯示,我們之前自己都寫過分頁。

那麼大家想一個問題,在資料量特別大的時候,我們的分頁會越往後讀取速度越慢,

當有一千萬條資料,我要看最後一頁的內容的時候,怎麼能讓我的查詢速度變快。

DRF給我們提供了三種分頁方式,我們看下他們都是什麼樣的~~

分頁元件的使用

DRF提供的三種分頁

from
rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

全域性配置

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)
檢視