手把手程式實作分享系列:Django Rest Ful Api 分頁器function

Walter Chiu
Bandai的機器學習筆記
3 min readJun 2, 2020

我們數據表中可能會有成千上萬條數據,當我們訪問某張表的所有數據時,我們不太可能需要一次把所有的數據都展示出來,因為數據量很大,對服務端的內存壓力比較大還有就是網絡傳輸過程中耗時也會比較大。

總而言之就是前端在使用你後端api的時候負荷太大,使用者會等很久。

通常我們會希望一部分一部分去請求數據,也就是我們常說的一頁一頁獲取數據並展示出來。

按頁碼數分頁,第n頁,每頁顯示m條數據

例如:http://127.0.0.1:8000/api/article/?page=2&size=1

意思就是在第二頁 每一頁顯示一個數據

那我們就來手把手操作一下

p.s 以下都是寫在view.py 裡面

step 1: 先寫一個分頁器

class MyPageNumber(PageNumberPagination):
page_size = 2 # 每頁顯示幾篇
page_size_query_param = 'size' # 把size這個參數打開
page_query_param = 'page' # 把page這個參數打開
max_page_size = None # 最大頁碼是多少 none就是沒有限制

這個分頁器就是所有的參數拉。

step2 : 套用在自己api裡面

view.py的寫法我這邊提供二種範例

class ArticleList(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
article_list = models.Article.objects.all().order_by("id")
# 分頁
page_obj = MyPageNumber()
page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
ser_obj = ArticleSerializer(page_article, many=True)
res["data"] = ser_obj.data
return page_obj.get_paginated_response(res

另一種範例:

在第5行的時候先call分頁的function過來

然後第18行的時候再把quaryset放進去

這樣就大功告成了~~

希望大家也順利

BTW:

我省略了幾個步驟

step0: 自己創對應的Serializer

step3: 自己去url對接你的view.py

這邊就不當大家是新手了,有問題自己來我django大全慢慢找對應的文章

或者在底下留言

--

--

Walter Chiu
Bandai的機器學習筆記

台大電機博士候選人,主要學習電腦科學、資訊教育,關心各種時事議題,歡迎一起討論有趣的專題 dodo0095@hotmail.com