四、DRF框架中的GenericAPIView
阿新 • • 發佈:2020-10-22
GenericAPIView提供了分頁、排序、過濾的功能
繼承GenericAPIView之後,往往需要在類屬性中指定查詢集和序列化器類
過濾排序
安裝django-filter
OrderingFilter:排序過濾引擎
filter_backends = [DjangoFilterBackend,OrderingFilter]:filter_backends指定過濾引擎,如果在全域性配置檔案中,已經指定,那麼這裡無需指定,這裡比全域性指定優先順序高
filterset_fields:指定過濾欄位,’把需要過濾的欄位放在這個列表裡,欄位只能是模型類中的欄位。比如端傳過來的name=‘專案’,那麼後端會返回name=‘專案’的那條記錄
ordering_fields :介面返回的欄位排序,比如在訪問介面時後面加上ordering=id,預設按id進行升序,路徑引數前面加減號(ordering=-id),就是降序,如:ordering_fields = ['id', 'name', 'leader']
提供了四個方法
get_queryset()方法:獲取查詢集,儘量用這個來獲取,因為如果直接通過Projects.objects.all()來獲取的話,如果這個物件被改了,那麼就會出問題
get_object()方法:根據前端傳的pk值獲取查詢集中的某條記錄,返回模型類物件,這個方法可以不用傳遞pk值,方法內會自動獲取pk值
get_serializer()方法:指定序列化器類
filter_queryset()方法過濾查詢集,把get_queryset()的查詢集物件放到這裡方法裡面進行過濾,根據前端傳遞的過濾條件進行
分頁
全域性配置setting中指定分頁引擎
# DEFAULT_PAGINATION_CLASS:全域性指定分頁引擎類
'DEFAULT_PAGINATION_CLASS': 'utils.pagination.ManualPageNumberPagination',
# 指定分頁引擎類後,一定要指定每一頁獲取的條數
'PAGE_SIZE': 3
paginate_queryset()方法:分頁方法,傳入查詢集,page為分頁之後的查詢集物件,需要返回get_paginated_responseget_paginated_response會提供總的條數,下一頁的連結,上一頁的連結,當前頁的資料
PageNumberPagination類
可以用來自定義一些分頁的引數
page = self.paginate_queryset(project_qs) if page is not None: serializer = self.get_serializer(instance=page, many=True) return self.get_paginated_response(serializer.data)
# 修改父類PageNumberPagination裡的分頁,修改完放在全域性配置表中 class ManualPageNumberPagination(PageNumberPagination): # 前端使用者指定的頁碼key的名稱,原來是page,現在是p page_query_param = 'p' # 前端使用者指定的每一頁條數key的名稱 page_size_query_param = 's' # 前端能指定的每一頁資料條數(當前不超過100條) max_page_size = 100 # 指定預設每一頁兩條資料,會覆蓋全域性配置中的條數 page_size = 2