DjangoRestFrameworkのSerializer(ModelSerializer)で、フィールドの値を関数/メソッドの結果で返したいことがあります。 これはバリデーションとしてSerializerを使うのでなく、モデルから辞書に値を変換したい場合の話です。
例えば、フィールドの日時が何日前かや、何かしら加工した値が欲しい場合です。 もちろんモデル自体にプロパティとして実装すれば疑問なくフィールドとして使えますが、そのSerializerでだけやりたい処理の場合はこの方法が有効です。
以下の例では Foo
モデルに、 bar
というフィールドでメソッドの結果を返すようにしています。
serializers.SerializerMethodField
を使ってできます。この場合 bar
はリードオンリーのフィールドになります。
class FooSerializer(serializers.ModelSerializer): bar = serializers.SerializerMethodField() def get_bar(self, obj): return obj.bar.title() class Meta: model = Foo fields = ( ... 'bar' )
SerializerMethodField
に何も指定しないと、メソッド名は get_bar
がデフォルトで指定されます。
メソッド名を特別に指定したい場合は SerializerMethodField("calc_bar")
のようにします。
でもこのときにメソッド名もフィールドと同じ名前(上記では bar
)にしてしまうと、フィールドが無効になってしまうので気をつけてください。
(名前が被ってしまうので、クラス内の値として後に書いたものだけが有効になってしまう)。