この記事の続きです。
programming-gogogogo.hatenablog.com
こちらの動画を見ながらPythonのDjango REST framework(DRF)について勉強しています。
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で書き直します。
公式ドキュメントでは以下に説明があります。
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に登録されているフィールドが確認できます。
感想
DRFでModel Serializerに使い方がわかってきました。
Model Serializerの使い方がわかりやすくなるように先に冗長な書き方でArticleSerializerを書いていたのも理解を深めるために良かったです。
他の勉強にも応用していきます。