Django Restframework-serializationコンポーネント

ソースコードの解釈

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

 

おすすめ

転載: www.cnblogs.com/wc89/p/12730148.html