Modelから取得したレコードをシリアライズするSerializerでは、入出力するkey(カラム)名が異なる場合、sourceオプションで入力元のカラム名を指定すればよい。
しかし、dictを整形したりvalidationしたいがためだけにSerializerを使う場合、これが逆にする必要があるようだった。
言い換えると、プロパティ名に入力key名、sourceオプションに出力key名を指定すれば実現可能。
from rest_framework import serializers class TestSerializer(serializers.Serializer): user_name = serializers.CharField(source='name') user_age = serializers.IntegerField(source='age')
data = { 'user_name': 'たろう', 'user_age': 24 } serializer = TestSerializer(data=data) serializer.is_valid() >>> True serializer.data >>> {'user_name': 'たろう', 'user_age': 24} serializer.validated_data >>> OrderedDict([('name', 'たろう'), ('age', 24)])
serializer.data
じゃなくて serializer.validated_data
を使うのも忘れずに。
serializer.data
は source -> property で
serializer.validated_data
は property -> source
になると考えると覚えやすい。
ちなみにエラーになるデータはこんな感じです。
data = { 'name': 'たろう', 'age': 24 } serializer = TestSerializer(data=data) serializer.is_valid() >>> False serializer.errors >>> {'user_name': [ErrorDetail(string='この項目は必須です。', code='required')], 'user_age': [ErrorDetail(string='この項目は必須です。', code='required')]}
この使い方の是非はしらない!