1. 程式人生 > 實用技巧 >四、DRF框架中的GenericAPIView

四、DRF框架中的GenericAPIView

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會提供總的條數,下一頁的連結,上一頁的連結,當前頁的資料
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類 可以用來自定義一些分頁的引數
# 修改父類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