第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

排序與分頁(yè)

有時(shí),客戶端希望 RESTful Web API 提供經(jīng)過(guò)排序后的字段,比如,按照年齡從大到小排列學(xué)生;有時(shí),根據(jù)客戶端條件,需要返回給前端的數(shù)據(jù)過(guò)多,如果一次提供,會(huì)大大降低響應(yīng)速度。此時(shí),可將數(shù)據(jù)做分割,分成不同的小份,發(fā)送給客戶端。這一節(jié),我們?yōu)榇蠹医榻B RESTful Web API 如何實(shí)現(xiàn)數(shù)據(jù)的排序與分頁(yè)。

1.排序的使用

在類視圖中設(shè)置 filter_backends,使用rest_framework.filters.OrderingFilter過(guò)濾器,REST framework 會(huì)在請(qǐng)求的查詢字符串參數(shù)中檢查是否包含了 ordering 參數(shù),如果包含了 ordering 參數(shù),則按照 ordering 參數(shù)指明的排序字段對(duì)數(shù)據(jù)集進(jìn)行排序。

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

示例:

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

此時(shí),訪問(wèn) http://127.0.0.1:8000/api/students/?ordering=-s_age ,服務(wù)器返回按年齡逆序排序后的學(xué)生信息。

2.分頁(yè)的使用

REST framework 提供了分頁(yè)的支持。

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

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每頁(yè)返回的數(shù)據(jù)條數(shù)
}

也可通過(guò)自定義 Pagination 類,來(lái)為視圖添加不同分頁(yè)行為。在視圖中通過(guò)pagination_clas 屬性來(lái)指明。

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

注意:如果需要關(guān)閉分頁(yè)功能,只需在視圖內(nèi)設(shè)置

pagination_class = None

3.自定義分頁(yè)器

如果默認(rèn)的分頁(yè)功能無(wú)法滿足要求,可以自行定義分頁(yè)器。

3.1 PageNumberPagination

前端訪問(wèn)網(wǎng)址形式:

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

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

  • page_size :每頁(yè)數(shù)目;
  • page_query_param :前端發(fā)送的頁(yè)數(shù)關(guān)鍵字名,默認(rèn)為"page";
  • page_size_query_param :前端發(fā)送的每頁(yè)數(shù)目關(guān)鍵字名,默認(rèn)為None;
  • max_page_size :前端最多能設(shè)置的每頁(yè)數(shù)量。
from rest_framework.pagination import PageNumberPagination

class StandardPageNumberPagination(PageNumberPagination):
    page_size_query_param = 'page_size' # 每頁(yè)數(shù)據(jù)條數(shù)
    max_page_size = 10

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

3.2 LimitOffsetPagination

前端訪問(wèn)網(wǎng)址形式:

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

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

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

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

4.小結(jié)

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