drf7 分頁組件

DRF的分頁

數據庫有幾千萬條數據,這些數據須要展現,不可能直接從數據庫把數據所有讀取出來,數據庫

這樣會給內存形成特別大的壓力,有可能還會內存溢出,因此但願一點一點的取,那展現的時候也是同樣的,老是要進行分頁顯示,加密

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

分頁組件的使用spa

DRF提供的三種分頁rest

 

全局配置
REST_FRAMEWORK = {
    'PAGE_SIZE': 2
}

pageNumber分頁

http://127.0.0.1:8000/book?page=2&size=1code

utils/pagination.py對象

自定義分頁類blog

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

class MyPagination(PageNumberPagination):
    # xxxx?page=1&size=2
    page_size = 1
    page_query_param = "page"
    page_size_query_param = "size"
    max_page_size = 3

 

pageDemo/views.py排序

from utils.pagination import MyPagination
class BookView(APIView):

    def get(self, request):
        queryset = Book.objects.all()
        # 1,實例化分頁器對象
        page_obj = MyPagination()
        # 2,調用分頁方法去分頁queryset
        page_queryset = page_obj.paginate_queryset(queryset, request, view=self)
        # 3,把分頁好的數據序列化返回
 ser_obj = BookSerializer(page_queryset, many=True)         # 4, 帶着上一頁下一頁鏈接的響應,返回帶超連接 需返回的時候用內置的響應方法
        return page_obj.get_paginated_response(ser_obj.data) #超連接
        # return Response(ret.data)

 

image

 

limitOffset分頁

自定義分頁類內存

class MyPagination(LimitOffsetPagination):

    default_limit = 1
    limit_query_param = "limit"    # 向後找多少條
    offset_query_param = "offset"  # 從第幾個開始找
    max_limit = 3

視圖

# 視圖和上面的大致一致
# 只有用的分頁類不一樣,其餘都相同
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)

image

 

CursorPagination遊標分頁

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

自定義分頁類

class MyPagination(CursorPagination):

    cursor_query_param = "cursor"
    page_size = 2
    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)

 

對url進行了加密,還支持對數據排序

image

 

7

相關文章
相關標籤/搜索