-
使用serializer.save()的mixin,CreateModelMixin處理post請求,UpdateModelMixin處理put,patch請求,這里可以看到create方法,get_serializer()創建序列化實例時,只是傳入request.data瀏覽器發送過來的數據,UpdateModelMixin,get_serializer()創建序列化實例時,傳入了通過get_object()方法取到數據對象instance
-
ModelSerializer繼承自Serializer類,Serializer繼承自BaseSerializer類,BaseSerializer繼承自Field類
-
UpdateModelMixin中,get_serializer(instance, data=request.data, partial=partial),這個方法實際就是序列化類的實例化,實例化的過程中添加了屬性self.instance=instance,CreateModelMixin沒有傳入instance,所以self.instance=None,
-
serializer.save()方法在BaseSerializer類中實現,調用了create方法和update方法,如果是put或者patch請求,也就是self.instance=instance,調用update方法,如果是post請求,調用的是create方法,update方法和create方法在BaseSerializer類中都是抽象方法,具體實現是在ModelSerializer類中,最終結果是post和put,patch請求得到的instance賦值給self.instance屬性
-
同時這里可以看到save方法也可以添加關鍵字參數,數據保存在**kwargs中
-
validated_data數據實際包括兩方面,一個是serializer.is_valid()方法之后經過驗證的數據,一個是save()方法添加進去的關鍵字參數
-
ModelSerializer類中create方法和update方法實際上就是經過驗證的數據存入到數據庫中,也就是serializer.is_valid()方法之后
-
總結:serializer.save()方法實際上就是把經過驗證的數據(也包括save()方法傳進去的關鍵字參數)存入到數據庫中的過程,最終將返回的數據實例賦值給self.instance屬性,如果是post請求,調用的ModelSerializer類中的create()方法,如果是put或者patch請求,調用的是ModelSerializer類中的update()方法