Django REST Frameworkでは、args
/kwargs
をシリアライザに追加して、request.data
経由ではなくurlパラメータまたはクッキーの値を使用して設定されたフィールドの値を設定するのはかなり標準的な作業です。例えば、私のコメントモデルのuser
フィールドをrequest.user
に設定する必要があります。これらの追加引数はコンテキストと呼ばれます。Django RESTフレームワーク:シリアライザのコンテキストの仕組みは?
StackOverflowのいくつかの質問(1、2)は、私がModelViewSet
のget_serializer_context()
メソッドを上書きすることを提案しています。私はしたし、それは助けにはなりません。私は、何が間違っているのか理解しようとしましたが、ソースコードから、このコンテキストシステムがどのように一般的に動作するはずであるか分かりません。 (この問題に関するドキュメントもありません)
シリアライザがコンテキストを通常のリクエストデータに追加する場所は誰でも説明できますか?私は2つの場所を見つけ、そこから文脈の値を保存します。
- serializer.save()、検証データとkwargsからを混合する方法であって、それは通常(例えばModelMixinsによって)引数なしで呼び出されます。
- fields.
__new__()
は、argsとkwargsをキャッシュしますが、後で誰も読むことはありません。あなたは汎用ビューまたはビューセットを使用するたびに
それほど私は考えましたが、後で何が起こるのですか?私は見ることができません。シリアライザは、このコンテキストを使用してフィールドに値を設定します。 –
通常の場合、コンテキストはシリアライザによって使用されません。シリアライザで 'request'オブジェクトにアクセスしたい場合、' self.context.get( 'request') 'を使います。また、シリアライザフィールドの 'to_representation'メソッドでは、' self.context'変数を使用して 'context'にアクセスできます。 –
([docs](http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context)から) 'context'を含むよくあるケースは、あなたがハイパーリンクされたリレーションを含むシリアライザ。シリアライザが現在のリクエストにアクセスして、完全修飾URLを適切に生成できるようにする必要があります。 –