2017-12-13 2 views
0

私はDjangoシリアライザを理解し、学びたいと思っています。例を挙げてみましょう:Django RESTシリアライザのattrs.getとは何ですか?

from rest_framework import serializers 

class CommentSerializer(serializers.Serializer): 
    email = serializers.EmailField() 
    content = serializers.CharField(max_length=200) 
    created = serializers.DateTimeField() 

    def restore_object(self, attrs, instance=None): 
     """ 
     Given a dictionary of deserialized field values, either update 
     an existing model instance, or create a new model instance. 
     """ 
     if instance is not None: 
      instance.email = attrs.get('email', instance.email) 
      instance.content = attrs.get('content', instance.content) 
      instance.created = attrs.get('created', instance.created) 
      return instance 
     return Comment(**attrs) 

「attrs.get」がどこから来たのか、それが何であるかは分かりません。でも、あまり明確なこのような線です

  instance.email = attrs.get('email', instance.email) 
      instance.content = attrs.get('content', instance.content) 
      instance.created = attrs.get('created', instance.created) 

その尻尾を食べるヘビのように感じている...「インスタンスは」すでに「電子メール」属性を持っている場合、見えるかのポイントは何ですかそれを見上げてそれを自分自身に設定するのが好きですか?

+0

に相当します。 –

+1

あなたはそれを次のように読むことができます:もしattrsがキー 'email'を持っていれば、それは例えば他の方法で現在の値を使用します。 –

+0

私はばかげていて、(1)名前空間 'attrs'の下で一連のメソッドを提供するいくつかのインポートを探していました。(2) '.get'がデフォルトを取ることを認識できませんでした。 – eSurfsnake

答えて

0

は、それがコメントモデルの辞書とインスタンスを必要とします関数の引数

def restore_object(self, attrs, instance=None): 

を見てみましょう。 ATTRSはinstance.email

return Comment(**attrs) 

を返す他に存在する場合は、既存のモデルがインスタンス として機能するように通過しない場合、このコード行は意味{'email':'whatever', ...}

attrs.get('email', instance.email) 

を形成し、標準のPython辞書リターンメールですattrs(辞書)に基づいて新しいモデルを作成し、そのモデルを返します。これは、 `attrs`にあるものでその値を上書きできるので、

return Comment(email ='email' ,content="" , created="") 
関連する問題