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

このエントリーをはてなブックマークに追加