【学習記録】Django REST frameworkチュートリアル4 Mode lSerializer

この記事の続きです。

programming-gogogogo.hatenablog.com

こちらの動画を見ながらPythonDjango REST framework(DRF)について勉強しています。

www.youtube.com

ArticleSerializerを以下のようにserializers.Serializerで定義したので、

class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    author = serializers.CharField(max_length=100)
    email = serializers.EmailField(max_length=100)
    date = serializers.DateTimeField()

    def create(self, validated_data):
        return Article.objects.create(validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.author = validated_data.get('author', instance.author)
        instance.email = validated_data.get('email', instance.email)
        instance.date = validated_data.get('date', instance.date)
        instance.save()
        return instance

より短いコードで同じ内容を書けるようにserializers.ModelSerializerで書き直します。

公式ドキュメントでは以下に説明があります。

www.django-rest-framework.org

Our SnippetSerializer class is replicating a lot of information that's also contained in the Snippet model. It would be nice if we could keep our code a bit more concise.
In the same way that Django provides both Form classes and ModelForm classes, REST framework includes both Serializer classes, and ModelSerializer classes.

公式ドキュメントではSnippetというクラス名ですが、これを自分で作ってるArticleというクラス名して以下のように解釈しました。
ArticleSerializerはArticleモデルと持っている情報に重複がある。
もっと簡潔にコードを書けた方が良い。
DjagoでFormクラスとModelFormクラスがあるように、DRFにはSerializerクラスとModelSerializerクラスがある。

ArticleSerializerクラスを以下のように修正します。

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'author']

上記を定義した後pythoh manage.py shellでターミナルから動作確認すると、ArticleSerializerに登録されているフィールドが確認できます。
f:id:JunpeiNakasone:20210315070112p:plain

感想

DRFでModel Serializerに使い方がわかってきました。
Model Serializerの使い方がわかりやすくなるように先に冗長な書き方でArticleSerializerを書いていたのも理解を深めるために良かったです。
他の勉強にも応用していきます。