1. 程式人生 > 其它 >Django(68)drf分頁器的使用

Django(68)drf分頁器的使用

前言

當後臺返回的資料過多時,我們就要配置分頁器,比如一頁最多隻能展示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開始提取,所以最後提取的資料是test2test3test4

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=需要排序的欄位