ModelSerializerを使って、Serialize化を簡略化する
ModelをSerialize化するのに、serializers.Serializerクラスを使っていましたが、
serializer.ModelSerializerを使って、Serialize化を簡略化したいと思います。
今までのSerializerクラスは以下のようになっていました。
from rest_framework import serializers
from flowers.models import Flower
class FlowerSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=150)
description = serializers.CharField(max_length=250)
release_date = serializers.DateTimeField()
flower_category = serializers.CharField(max_length=200)
was_included_in_home = serializers.BooleanField(required=False)
def create(self, validated_data):
return Flower.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.description = validated_data.get('description', instance.description)
instance.release_date = validated_data.get('release_date', instance.release_date)
instance.flower_category = validated_data.get('flower_category', instance.flower_category)
instance.was_included_in_home = validated_data.get('was_included_in_home', instance.was_included_in_home)
instance.save()
return instance
ModelSerializerはcreateとupdateがimplemnetされているので、自分で実装する必要がありません。
また、モデルのDBのカラム名に関しても、model変数にモデル名を、fields変数にセットするだけになります。
では、FlowerSerializerクラスを以下のように書き換えてください。
from rest_framework import serializers
from flowers.models import Flower
class FlowerSerializer(serializers.ModelSerializer):
class Meta:
model = Flower
fields = ('id',
'name',
'description',
'release_date',
'flower_category',
'was_included_in_home')
ModelSerializerの挙動確認
Serializerクラスを変更したので、Fieldが生成されているか挙動を確認してみます。
以下のコマンドを叩いて、django shellの中に入ります。
python manage.py shell
shellの中に入ったら、以下のコマンドを叩きます。
from flowers.serializers import FlowerSerializer
serializer = FlowerSerializer()
print(repr(serializer))
出力は以下のようになり、Flower modelの通りにfieldが生成されていることが確認できます。
FlowerSerializer():
id = IntegerField(label='ID', read_only=True)
name = CharField(max_length=150, required=False)
description = CharField(allow_blank=True, max_length=250, required=False)
release_date = DateTimeField()
flower_category = CharField(max_length=200, required=False)
was_included_in_home = BooleanField(required=False)
こちらを参考に、知識をまとめています。
初版:2018/5/28