DjangoRestFramework中serializer.save()方法經歷了什么?


  1. 使用serializer.save()的mixin,CreateModelMixin處理post請求,UpdateModelMixin處理put,patch請求,這里可以看到create方法,get_serializer()創建序列化實例時,只是傳入request.data瀏覽器發送過來的數據,UpdateModelMixin,get_serializer()創建序列化實例時,傳入了通過get_object()方法取到數據對象instance

    screenshot_8.png
    screenshot_2.png

  2. ModelSerializer繼承自Serializer類,Serializer繼承自BaseSerializer類,BaseSerializer繼承自Field類

    screenshot.png

  3. UpdateModelMixin中,get_serializer(instance, data=request.data, partial=partial),這個方法實際就是序列化類的實例化,實例化的過程中添加了屬性self.instance=instance,CreateModelMixin沒有傳入instance,所以self.instance=None,

    screenshot_3.png
    screenshot_4.png

  4. serializer.save()方法在BaseSerializer類中實現,調用了create方法和update方法,如果是put或者patch請求,也就是self.instance=instance,調用update方法,如果是post請求,調用的是create方法,update方法和create方法在BaseSerializer類中都是抽象方法,具體實現是在ModelSerializer類中,最終結果是post和put,patch請求得到的instance賦值給self.instance屬性

    screenshot_5.png
    screenshot_6.png

  5. 同時這里可以看到save方法也可以添加關鍵字參數,數據保存在**kwargs中

    screenshot.png

  6. validated_data數據實際包括兩方面,一個是serializer.is_valid()方法之后經過驗證的數據,一個是save()方法添加進去的關鍵字參數

    screenshot_7.png

  7. ModelSerializer類中create方法和update方法實際上就是經過驗證的數據存入到數據庫中,也就是serializer.is_valid()方法之后

    screenshot_10.png
    screenshot_9.png

  8. 總結:serializer.save()方法實際上就是把經過驗證的數據(也包括save()方法傳進去的關鍵字參數)存入到數據庫中的過程,最終將返回的數據實例賦值給self.instance屬性,如果是post請求,調用的ModelSerializer類中的create()方法,如果是put或者patch請求,調用的是ModelSerializer類中的update()方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM