DRF 分頁

DRF 分頁

DER分頁

  • 做用:數據庫有幾千萬條數據,這些數據須要展現,咱們不可能直接從數據庫把數據所有讀取出來,這樣會給內存形成特別大的壓力,有可能還會內存溢出,因此咱們但願一點一點的取,那展現的時候也是同樣的,老是要進行分頁顯示,咱們以前本身都寫過度頁。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)

三 加密遊標分頁,把上一頁和下一頁的id記住

  • 定義類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)
相關文章
相關標籤/搜索