APIView使用方法,直接繼承APIView,get或者post請求。方法很簡單1.先獲取到要操作的數據,然后把數據放到serializer中序列化或者反序列化,最后return返回值(記得.data)
1.第一個例子
2.第二個例子
主要流程:獲取到數據對象,然后傳入到serializer中校驗,最后response返回前端數據(注意返回的數據要.data)
工具視圖(ListAPIView,CreataAPIView等)
https://www.cnblogs.com/wangcuican/p/11710450.html 工具視圖學習資料
我們要知道上面這些工具視圖是繼承GenericAPIView和Mixins各種工具類的
GenericAPIView
我們要先了解GenericAPIView的用法(比如下面的)(******)
先寫GenericAPIView的兩個屬性:queryset(指明視圖需要的數據,這個主要是針對從數據庫中獲取數據,如果是從前端獲取數據就不用寫queryset了,數據就從reqeust中獲取)和serializer_class(指明視圖使用哪個序列化器)
如果你寫了上面的兩個屬性,就必須需要使用get_queryset和get_serializer進行操作(特別需要注意******)
get_queryset功能:從類屬性queryset中獲取model的queryset數據
get_serializer功能:從類屬性serializer_class中獲得serializer的序列化類,主要是給Mixin擴展類使用
from rest_framework.generics import GenericAPIView class BookGenericAPIView(GenericAPIView): queryset = models.Book.objects.filter(is_delete=False) serializer_class = serializers.BookModelSerializer # 自定義主鍵的 有名分組 名 lookup_field = 'pk' #先定義好,單取可以使用 # 群取 def get(self, request, *args, **kwargs): book_query = self.get_queryset() #獲取queryset數據(model查詢數據) book_ser = self.get_serializer(book_query, many=True) #我的理解是數據被[]嵌套就要寫many=True(book_query查出來是queryset類型,如果查出來是object就不用寫many=True) book_data = book_ser.data #返回前台的數據必須需要.data,才能返回(******) return APIResponse(results=book_data) # 單取 def get(self, request, *args, **kwargs): book_query = self.get_object() book_ser = self.get_serializer(book_query) book_data = book_ser.data return APIResponse(results=book_data)
Mixins各種工具類(配合GenericAPIView一起使用)
mixins有五個工具類文件,一共提供了五個工具類,六個工具方法:單查、群查、單增、單刪、單整體改、單局部改
五個工具類:CreateModelMixin(增加),DestroyModelMixin(刪除),ListModelMixin(查詢,查queryset),RetrieveModelMixin(查詢,查對象,針對於存在"pk"),UpdateModelMixin(修改)
舉例子
現在我們就有疑問了,前面說了用GenericAPIView,就必須要get_queryset()和serializer_class()。這里Mixins工具類也使用了GenericAPIView為什么沒見這兩個方法。
get_queryset()和serializer_class()這兩個方法在list,create等源碼方法中
源碼:(針對增加數據的源碼create)這里面用到了get_serializer,所以我們在這之前就必須設定一個serializer_class方法。
舉例子:Create增加的用法(這里我們直接用CreateAPIView方法,在源碼中已經繼承GenericAPIView和Mixin工具類。就不用再去自定義類,然后繼承GenericAPIView和Mixin工具類這種麻煩的操作)
from rest_framework.generics import CreateAPIView class RegisterCreateAPIView(CreateAPIView): serializer_class = serializers.RegisterModelSerializer #重寫create方法,CreateModelMixin中的create方法,下面這段代碼是到create源碼中粘貼過來的(******) def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 校驗失敗就主動拋異常 => 自定義異常結果,配置異常模塊 user_obj = serializer.save() # 要自定義入庫邏輯,重寫serializer中的create方法 headers = self.get_success_headers(serializer.data) # 響應結果需要格式化,使用序列化類要提供序列化與反序列化兩套規則
#返回前端的數據APIResponse return APIResponse(0, 'ok', results=serializers.RegisterModelSerializer(user_obj).data, http_status=201, headers=headers )
這里我們為什么要重寫create方法呢,因為想自定義返回值APIResponse,如果你不需要重寫方法,那么這個類下面只寫queryset和serializer_class這兩個屬性就行了。