亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

排序與分頁

有時,客戶端希望 RESTful Web API 提供經過排序后的字段,比如,按照年齡從大到小排列學生;有時,根據客戶端條件,需要返回給前端的數據過多,如果一次提供,會大大降低響應速度。此時,可將數據做分割,分成不同的小份,發送給客戶端。這一節,我們為大家介紹 RESTful Web API 如何實現數據的排序與分頁。

1.排序的使用

在類視圖中設置 filter_backends,使用rest_framework.filters.OrderingFilter過濾器,REST framework 會在請求的查詢字符串參數中檢查是否包含了 ordering 參數,如果包含了 ordering 參數,則按照 ordering 參數指明的排序字段對數據集進行排序。

前端可以傳遞的 ordering 參數的可選字段值需要在 ordering_fields 中指明。

示例:

class StudentViewSet(ModelViewSet):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 's_age', 's_number')

此時,訪問 http://127.0.0.1:8000/api/students/?ordering=-s_age ,服務器返回按年齡逆序排序后的學生信息。

2.分頁的使用

REST framework 提供了分頁的支持。

有時,前端根據一定的條件查詢的數據量是驚人的,如果按照查詢條件,一次性返回所有數據,往往會使服務器承受巨大的壓力,此時我們可以以分頁的方式提供數據,相當于將龐大的數據打散,每次只按要求返回一定數量的數據,就可以減輕服務器壓力。在 Django Rest framework 中,可以在配置文件中設置全局的分頁方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每頁返回的數據條數
}

也可通過自定義 Pagination 類,來為視圖添加不同分頁行為。在視圖中通過pagination_clas 屬性來指明。

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000
class StudentViewSet(ModelViewSet):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    pagination_class = LargeResultsSetPagination

注意:如果需要關閉分頁功能,只需在視圖內設置

pagination_class = None

3.自定義分頁器

如果默認的分頁功能無法滿足要求,可以自行定義分頁器。

3.1 PageNumberPagination

前端訪問網址形式:

GET  http://127.0.0.1/api/students/?page=4

可以在子類中定義的屬性:

  • page_size :每頁數目;
  • page_query_param :前端發送的頁數關鍵字名,默認為"page";
  • page_size_query_param :前端發送的每頁數目關鍵字名,默認為None;
  • max_page_size :前端最多能設置的每頁數量。
from rest_framework.pagination import PageNumberPagination

class StandardPageNumberPagination(PageNumberPagination):
    page_size_query_param = 'page_size' # 每頁數據條數
    max_page_size = 10

class StudentViewSet(ModelViewSet):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    pagination_class = StandardPageNumberPagination

3.2 LimitOffsetPagination

前端訪問網址形式:

GET http://127.0.0.1/api/students/?limit=100&offset=400

可以在子類中定義的屬性:

  • default_limit: 默認限制,默認值與PAGE_SIZE設置為一致;
  • limit_query_param limit:參數名,默認 'limit;
  • offset_query_param: offset 參數名,默認 ‘offset’;
  • max_limit :最大 limit 限制,默認 None。
from rest_framework.pagination import LimitOffsetPagination

class StudentViewSet(ModelViewSet):
    queryset = StudentsModel.objects.all()
    serializer_class = StudentsSerializer
    pagination_class = LimitOffsetPagination

4.小結

本小節介紹了排序和分頁功能,這兩個功能也是開發中使用頻率較高的功能,排序功能可以按一定順序返回數據,而分頁功能可以減輕服務器壓力,節省客戶端得到響應的時間。在使用分頁時,要注意 offset(偏移量)參數,很多返回的數據與理想數據不一致,通常都是該參數出現了問題。大家要理解核心原理,這樣才能在使用時得心應手。