django_rest_framework之GenericAPIView(一)源码讲解
1、GenericAPIView是APIView的子類,所以具備APIView的所有功能
a、具備View的所有特性
b、提供了認證、授權、限流功能
c、將JsonResponse——》Response(如果是序列化輸出多條數據將safe=False去掉)
d、通過request.data獲取前端傳遞的參數,后端通過請求頭中的content_Type參數,生成指定的數據類型(application / json、application / x - www - form - urlencoded、multipart / form - data)
GenericAPIView
除了具備APIView的所有功能外,還具備了自己額外的功能
2、一旦繼承GenericAPIView父類(GenericAPIView的子類)
a、具備View的所有特性
b、具備了認證、授權、限流功能
c、還支持對于獲取列表數據接口的功能:搜索、排序、分頁
GenericAPIView需要指定queryset、serializer_class類屬性
queryset:指定當前類視圖的實例方法需要使用的查詢集對象
serializer_class:指定當前類視圖的實例方法需要的序列化器類
導入 from rest_framework.generics import GenericAPIView
3、代碼最好不要直接用下列代碼
queryset=self.queryset、serializer=self.serializers_class(instance=self.queryset, many=True)
建議用
queryset=self.get_queryset()
serializer = self.get_serializer(instance=queryset, many=True)
源碼分析:
為什么要這么做呢?我直接用類屬性queryset=self.queryset不就可以嗎???
原因:為了以后可以重寫get_queryset方法,例如用戶有權限(獲取的是完整的數據)和用戶無權限(獲取的是部分簡單的數據)下獲取到的列表數據不是一套查詢集,接口之間用到的數據集不同
源碼分析:
注意:
1、在實例方法中,往往使用get_queryset()方法獲取查詢集對象
2、一般不會直接調用queryset類屬性,原因:為了提供讓用戶重寫get_queryset()方法
3、如果未重寫get_queryset()方法,那么必須得指定queryset類屬性
4、在實例方法中,往往使用get_serializer方法獲取序列化器類
5、一般不會直接調用serializer_class類屬性,原因:為了提供讓用戶重寫get_serializer_class()方法
6、如果未重寫get_serializer_class()方法,那么必須得指定serializer_class類屬性
4、get_object()方法
1、父類給提供了get_object()方法,不需要重寫,直接繼承,代碼如下:
2、pk也不用傳遞,可以源碼調試
結果如下圖
3、如果路由視圖我設置為kk
只需要在類中定義屬性:lookup_url_kwarg = ‘kk’
a、lookup_url_kwarg默認為None
b、如果lookup_url_kwarg默認為None,那么lookup_url_kwarg與look_field相同(pk)
c、lookup_url_kwarg指定url路由條目中外鍵的路徑參數名稱
lookup_url_kwarg = ‘kk’
d、如果不傳lookup_url_kwarg(一般不需要傳遞),默認為pk,如果傳遞的話需要在前端路由中指定
get_object可以獲取模型對象,無需傳遞外鍵值
5、最后優化的代碼如下:
總結
以上是生活随笔為你收集整理的django_rest_framework之GenericAPIView(一)源码讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django_rest_framewor
- 下一篇: django_rest_framewor