Django-Rest-Framework的分頁

Django-Rest-Framework的分頁

DRF的分頁

爲何要使用分頁

其實這個不說你們都知道,你們寫項目的時候也是必定會用的,

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

這樣會給內存形成特別大的壓力,有可能還會內存溢出,因此咱們但願一點一點的取,

那展現的時候也是同樣的,老是要進行分頁顯示,咱們以前本身都寫過度頁。

那麼你們想一個問題,在數據量特別大的時候,咱們的分頁會越日後讀取速度越慢,

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

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

DRF提供的三種分頁

1
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

全局配置數據庫

1
2
3
REST_FRAMEWORK = {
'PAGE_SIZE': 2
}

第一種

PageNumberPagination 看第n頁,每頁顯示n條數據
http://127.0.0.1:8000/book?page=2&size=1restful

自定義分頁類

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

視圖

1
2
3
4
5
6
7
8
9
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)

返回帶頁碼連接的響應

1
2
3
4
5
6
7
8
9
10
11
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=1ide

自定義的分頁類

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

視圖

1
2
3
4
5
6
7
8
9
10
11
12
# 只有用的分頁類不一樣,其餘都相同
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記住post

自定義分頁類

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

視圖

1
2
3
4
5
6
7
8
9
10
11
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)
相關文章
相關標籤/搜索