Django Rest FrameworkのSerializerでバリデーションをして、ついでにkey名を変更したいとき

Modelから取得したレコードをシリアライズするSerializerでは、入出力するkey(カラム)名が異なる場合、sourceオプションで入力元のカラム名を指定すればよい。
しかし、dictを整形したりvalidationしたいがためだけにSerializerを使う場合、これが逆にする必要があるようだった。
言い換えると、プロパティ名に入力key名、sourceオプションに出力key名を指定すれば実現可能。

Python 3.6.8、Django 2.1.7で検証。

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')]}

この使い方の是非はしらない!