1. ホーム
  2. django

[解決済み] Django REST Framework: ModelSerializerに追加フィールドを追加する

2022-04-13 14:10:49

質問

モデルをシリアライズしたいのですが、シリアライズされるモデル・インスタンス上でいくつかのデータベース検索を行う必要がある追加フィールドを含めたいのですが、どうすればいいですか?

class FooSerializer(serializers.ModelSerializer):
  my_field = ... # result of some database queries on the input Foo object
  class Meta:
        model = Foo
        fields = ('id', 'name', 'myfield')

どうするのが正解なのでしょうか?私は、次のように見ています。 を使用すると、追加の "コンテキスト" を渡すことができます。 をシリアライザに渡しますが、コンテキスト辞書の追加フィールドを渡すのが正解でしょうか?

このアプローチでは、必要なフィールドを取得するロジックがシリアライザーの定義で自己完結しないことになります。 my_field . DRFシリアライザーのドキュメントの他の箇所では、次のように記述されています。 とは "エクストラフィールドは、モデル上の任意のプロパティまたはcallableに対応することができます". 私が言っているのは、"extra fields"のことでしょうか?

に関数を定義する必要があります。 Foo を返すモデル定義 my_field の値で、シリアライザーで my_field をその callable にフックするのですか?それはどのようなものでしょうか?

必要であれば、質問を明確にすることをうれしく思います。

解決方法は?

私が思うに SerializerMethodField は、あなたが探しているものです。

class FooSerializer(serializers.ModelSerializer):
  my_field = serializers.SerializerMethodField('is_named_bar')

  def is_named_bar(self, foo):
      return foo.name == "bar" 

  class Meta:
    model = Foo
    fields = ('id', 'name', 'my_field')

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield