ソースコードの解釈
BaseSerializer(フィールド)
デフ __init__(自己、インスタンス=なし、データ=空、** kwargsから): self.instance = インスタンス 場合はデータがあり ません空: self.initial_data = データ self.partial = kwargs.pop(' 部分' 、False)が 自己を。 _context = kwargs.pop(' context ' 、{}) kwargs.pop(' many ' 、None) super()。__init__(** kwargsから)
パラメータ:
インスタンス
data:デシリアライズされるデータ、つまりユーザーが送信したデータ
** kwargsキーワードパラメータ
あなたは何をしましたか
- インスタンスデータをオブジェクト属性インスタンスに割り当てます
- ユーザーがデータ(データ)を渡す場合、データをオブジェクトプロパティself.initial_dataに割り当てます。
- 部分的
- _環境
- 多くをポップする
- 提出された__init__メソッドを呼び出す
デフ __new__(CLS、* argsを、** kwargsから): #私たちは、自動的に作成するために、このメソッドをオーバーライド #`多く= true`には設定されている場合、代わりに` ListSerializer`クラスを。 if kwargs.pop(' many ' 、False): return cls.many_init(* args、** kwargs) return super()__new__(cls、* args、** kwargs) @classmethod def many_init(cls、* args、** kwargs): "" " このメソッドは、` ListSerializer`親の作成を実装します クラスは、` many = True`が使用されている場合、必要に応じてカスタマイズできます。 親に渡されるキーワード引数と子に渡されるキーワード引数制御 。 一般的なケースをカバーするために 、親クラスと子クラスの両方にほとんどの引数を渡すのは慎重すぎることに注意してください。あなたがいる場合は 、このメソッドをオーバーライドあなたはおそらく何かがはるかに簡単にしたい、などでしょう: @classmethod デフmany_init(CLS、* argsを、** kwargsから): kwargsから[ '子'] = CLS() CustomListSerializerを(返す*引数、* * kwargs) "" " allow_empty = kwargs.pop(' allow_empty ' child_serializer = cls(* args、** kwargs) list_kwargs = { ' child ' :child_serializer、 } allow_empty がNone でない場合: list_kwargs [ ' allow_empty ' ] = allow_empty list_kwargs.update({ key:value for key、value in kwargs.items() if key in LIST_SERIALIZER_KWARGS }) meta = getattr(cls、' Meta ' 、None)list_serializer_class = getattr(meta、' list_serializer_class ' 、ListSerializer) return list_serializer_class(* args、** list_kwargs)
def to_internal_value(self、data): raise NotImplementedError(' `to_internal_value()`を実装する必要があります。' ) def to_representation(self、instance): raise NotImplementedError(' `to_representation()`を実装する必要があります。' ) def update(self 、インスタンス、validated_data): raise NotImplementedError(' `update()`を実装する必要があります。' ) def create(self、validated_data): raise NotImplementedError(' `create()`を実装する必要があります。')
サブクラスは独自に実装する必要があります
保存方法
def save(self、** kwargs): assert not hasattr(self、' save_object ' )、( ' Serializer `%s。%s` has old-style version 2` .save_object() ` ' ' 互換性がなくなりましたRESTフレームワーク3との' ' の代わりに使用して、新しいスタイルの`.create()`と`.update()`メソッド。'% (自己。__class__。__module__、自己。__class__。__name__ ) ) アサートはhasattr(自己、' _errors ' )、( ' `.save()`を呼び出す前に、 `.is_valid()`を呼び出す必要があります。' ) assert not self.errors、(' シリアライザで無効なデータを使用して ` .save ()`を呼び出すことはできません。' ) #`serializer.save(commit = False)`の誤った使用を 防ぐ assert ' commit ' not in kwargs、( " 'commit'は 'save()'メソッドへの有効なキーワード引数ではありません。" " データベースにコミットする前にデータにアクセスする必要がある場合は、代わりに" " serializer.validated_data 'を検査してください。 また、「保存()」に、追加のキーワード引数を渡すことができます場合は、「 」の必要性が保存されたモデルインスタンスに余分な属性を設定します。" " 例: 'serializer.save(owner = request.user)'。 ' " ) assert not hasattr(self、' _data ' )、( " `serializer.data`にアクセスした後、` .save() `を呼び出すことはできません。" " データベースにコミットする前にデータにアクセスする必要がある場合は、" " inspect '代わりにserializer.validated_data '。" リスト(self.validated_data.items()) + リスト(kwargs.items()) ) 場合 self.instanceはありません ませんなし: self.instance = self.update(self.instance、validated_data) アサート self.instance ではない ではないなし、 ( ' `update()`はオブジェクトインスタンスを返しませんでした。' ) else : self.instance = self.create(validated_data) assert self.instance is not None、( '`create()`はオブジェクトインスタンスを返しませんでした。" ) の戻り self.instance
効果:逆のシーケンスでは、インスタンス属性を使用して、作成操作と更新操作の実行を判断します
パラメーター:** kwargsはN個のキーワードパラメーターを受け入れ、キーワードパラメーターをvalidate_dataにマージします
それらのことをしましたか
- 検証されたユーザーが送信したデータ(validated_data)を、プログラマーがsaveメソッドを呼び出したときに渡されたキーワードパラメーターと組み合わせて、マージされたデータをvalidated_data属性に再度割り当てます。
validated_data = dict( list(self.validated_data.items()) + list(kwargs.items()) )
- 属性インスタンスが存在するかどうかを判別し、存在する場合はupdateメソッドを呼び出し、そうでない場合はcreateメソッドを呼び出します
self.instance が None でない場合: self.instance = self.update(self.instance、validated_data) assert self.instance is not None、( ' `update()` was not a object instance。' ) else : self。 instance = self.create(validated_data) assert self.instance is not None、( ' `create()` was not a object instance。' ) return self.instance