概要
- REST framework には
ModelSerializer
という Django のModel
を指定すると、いい感じにフィールドが生えたSerializer
を生成してくれる機能があります。 - この
ModelSerializer
は 内部では Django のModel
のField
に応じて restframework のField
とマッピングさせています。 - 例えば
django.models.TextField
はrestframwork.fields.CharField
にマッピングされています。 - このマッピングのカスタマイズできるといいですよねという話です。
例えば
- 例えば、ローカライズした日時情報を返すカスタムフィールドを作ったとします。
- https://stackoverflow.com/a/30570521
class LocalDateTimeField(serializers.DateTimeField):
""" localize した時間を扱う DateTimeField
"""
def to_representation(self, value):
value = timezone.localtime(value)
return super(LocalDateTimeField, self).to_representation(value)
こういうカスタムフィールドを作ったら、個別の Serializer にそのまま設定すれば利用可能です。
class HogeSerializer(serializers.ModelSerializer):
created_at = LocalDateTimeField()
class Meta:
model = Hoge
fields = "__all__"
ですが、毎回個別のSerializer
に設定するのは、漏れもあるしちょっと面倒です。 そこで ModelSerializer.serializer_field_mapping
の設定を変えるような MyModelSerializer
を作ってみます。
from django.db import models
class MyModelSerializer(serializers.ModelSerializer):
serializer_field_mapping = (
serializers.ModelSerializer.serializer_field_mapping.copy()
)
serializer_field_mapping[models.DateTimeField] = LocalDateTimeField
django.models.DateTimeField
が LocalDateTimeField
にマッピングされたMyModelSeriazer
ができました。
あとは下記のように MyModelSerializer
を継承するだけです。
class HogeSerializer(MyModelSerializer):
class Meta:
model = Hoge
fields = "__all__"
これで MyModelSerializer
を継承している全ての Serializer
は全てのDatetimeField
がローカライズされるようになります。
以上です。