概要
- 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がローカライズされるようになります。
以上です。