做者:HelloGitHub-追夢人物web
若是沒有設置分頁,django-rest-framework 會將全部資源類表序列化後返回,若是資源不少,就會對網站性能形成影響。爲此,咱們來給博客文章列表 API 添加分頁功能。django
django-rest-framework 爲分頁功能提供了多個輔助類,經常使用的有:api
PageNumberPagination
編輯器
將資源分爲第 1 頁、第 2 頁...第 n 頁,使用頁碼號請求分頁結果。函數
LimitOffsetPagination
post
經過 limit
和 offset
兩個參數來控制請求的資源。例如經過發送 API 請求:/posts/?offset=20&limit=5,將獲取文章資源列表第 20 篇後的 5 篇文章。若是 offset 以等差數列遞增,limit 保持不變,則等價於按頁碼分頁。但 offset 和 limit 能夠爲任意值,所以這種分頁比 PageNumberPagination
更加靈活。性能
要使用分頁功能很是簡單,只需在項目的配置文件中配置好分頁選項,便可全局啓用分頁功能。打開 config/common.py 配置文件,寫入以下的分頁配置:網站
REST_FRAMEWORK = {
# 設置 DEFAULT_PAGINATION_CLASS 後,將全局啓用分頁,全部 List 接口的返回結果都會被分頁。 # 若是想單獨控制每一個接口的分頁狀況,可不設置這個選項,而是在視圖函數中進行配置 "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", # 這個選項控制分頁後每頁的資源個數 "PAGE_SIZE": 10, } 複製代碼
配置完成以後,全部通用視圖函數或者視圖集生成的資源列表 API,返回的資源列表都會被分頁。配置文件中的分頁設置將做用於全局,若是某個視圖函數或者視圖集不想使用全局配置怎麼辦呢?能夠在視圖函數或者視圖集中設置 pagination_class 屬性,指定須要使用的分頁輔助類便可。例如將博客文章列表分頁替換爲 limit offset 的分頁方式,能夠這樣設置:spa
from rest_framewrok.pagination import PageNumberPagination
class PostViewSet(viewsets.GenericViewSet): pagination_class = LimitOffsetPagination 複製代碼
這樣,PostViewSet
視圖集將返回 limit offset 分頁形式的文章列表,而其餘視圖或者視圖集仍將使用全局的分頁配置。rest
請求文章 api,返回結果以下:
對返回結果的解釋:
count:總資源數目
next:下一頁資源的連接
previous:上一頁資源的連接
results:當前頁的資源列表