前言
當後臺返回的資料過多時,我們就要配置分頁器,比如一頁最多隻能展示10條等等,drf
中預設配置了3個分頁面
- PageNumberPagination:基礎分頁器,效能略差
- LimitOffsetPagination:偏移分頁器
- CursorPagination:遊標分頁器,效能強大
PageNumberPagination
基礎分頁器PageNumberPagination
,資料量越大效能越差。
首先我們在app
中建立一個pagination.py
檔案,然後自定義一個分頁器類,繼承自PageNumberPagination
:
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
"""
普通分頁,資料量越大效能越差
"""
# 預設頁面展示的條數
page_size = 3
# 前端訪問url需要新增 ?page=頁碼
page_query_param = 'page'
# 使用者自定義返回的條數,格式?page_size=頁數
page_size_query_param = "page_size"
# 使用者自定義返回的條數最大限制,數值超過5也只展示5條
max_page_size = 5
如果我們需要區域性配置則在類檢視中訪問使用pagination_class = MyPageNumberPagination
即可
如果是全域性配置,則在settings.py
檔案中配置如下:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'api.pagination.MyPageNumberPagination',
}
之後我們訪問url
只需在後面加入?page=頁碼數
即可
比如http://127.0.0.1:8000/api/cars/?page=2
,代表訪問第二頁的資料,資料的條數預設為page_size
的值
比如http://127.0.0.1:8000/api/cars/?page=2&page_size=5
,代表訪問第二頁的資料,使用者自定義返回的條數為5條
LimitOffsetPagination
首先我們自定義一個分頁器類,繼承自LimitOffsetPagination
:
class MyLimitOffsetPagination(LimitOffsetPagination):
# url後面跟limit請求引數,
limit_query_param = 'limit'
# url後面跟offset請求引數
offset_query_param = 'offset'
# 最大限制20條
max_limit = 20
# 預設限制3條
default_limit = 3
之後我們訪問url
只需要在後面加入?limit=10
即可
比如http://127.0.0.1/api/cars/?limit=10
代表訪問的資料最多展示10條,如果你limit
的值>max_limit
,那麼還是按照max_limit
的值來展示資料的條數
比如http://127.0.0.1/api/cars/?offset=1
,這裡沒有limit
引數,所以預設展示3條,offset=1
代表從資料庫列表中提取資料的時候,是從下標1開始提取,比如提取的資料列表是['test1', 'test2', 'test3', 'test4']
,本來我們預設提取前3條,但是你加上offset=1
後,他是從列表下標為1開始提取,所以最後提取的資料是test2
和test3
和test4
CursorPagination
遊標分頁器跟基礎分頁器用法差不多,只是遊標分頁的針對下一頁資料的url
進行了加密
首先我們自定義一個分頁器類,繼承自CursorPagination
:
class MyCursorPagination(CursorPagination):
"""
Cursor 游標分頁 效能高,安全
"""
page_size = 10
page_size_query_param = "page_size"
max_page_size = 20
ordering = '-price'
如果我們檢視中使用了排序過濾filter_backends = [OrderingFilter]
,那麼我們在訪問url
的時候必須攜帶引數?ordering=需要排序的欄位
。