前回は、シリアライズクラスのバリデーションについて学びました。
今回は、ModelSerializerクラスについて学びます。
前回
ModelSerializerクラスについて
ModelSerializerクラスは、私達が定義したDjangoモデルをベースにシリアライズすることができる便利ユーティリティです。
ModelSerializerクラスの実装
早速、実装しましょう。既存のArticleSerializerクラスを下記のように書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# news/api/serializers.py from rest_framework import serializers from news.models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: # シリアライズしたいmodelを指定 model = Article # id以外をシリアライズ exclude = ("id", ) # 全てのフィールドをシリアライズ # fields = "__all__"" # title, description, body, bodyをシリアライズ # fields = ("title", "description", "body") |
たったこれだけです。
Metaクラスには、シリアライズ対象Modelの指定と、シリアライズ対象データについて記述しました。
ModelSerializerクラスの動作確認
動作確認をするために、開発サーバーを立ち上げましょう。
1 |
python manage.py runserver |
続いて「http://localhost:8000/api/articles/」にアクセスしましょう。

表示されたでしょうか。簡単ですね。
ModelSerializerクラスのフィールド拡張
画面に表示されているauthorやtitleは、Articleモデルに設定されている変数です。
以下のようにすれば、フィールドの拡張ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# news/api/serializers.py from datetime import datetime from django.utils.timesince import timesince from rest_framework import serializers from news.models import Article class ArticleSerializer(serializers.ModelSerializer): time_since_publication = serializers.SerializerMethodField() def get_time_since_publication(self, object): publication_date = object.publication_date now = datetime.now() time_delta = timesince(publication_date, now) return time_delta class Meta: model = Article exclude = ("id", ) |
time_since_publication項目を追加しました。SerializerMethodFieldで追加できるようです。
ブラウザをリロードしましょう。

便利ですね。
terminal上でも確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> from news.api.serializers import ArticleSerializer >>> serializer = ArticleSerializer >>> serializer = ArticleSerializer() >>> print(repr(serializer)) ArticleSerializer(): time_since_publication = SerializerMethodField() author = CharField(max_length=50) title = CharField(max_length=120) description = CharField(max_length=200) body = CharField(style={'base_template': 'textarea.html'}) location = CharField(max_length=120) publication_date = DateField() active = BooleanField(required=False) created_at = DateTimeField(read_only=True) updated_at = DateTimeField(read_only=True) |
ModelSerializerクラスのバリデーション
以前、Serializerクラスでバリデーションを実装しました。
ModelSerializerクラスにも追加してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# news/api/serializers.py from datetime import datetime from django.utils.timesince import timesince from rest_framework import serializers from news.models import Article class ArticleSerializer(serializers.ModelSerializer): time_since_publication = serializers.SerializerMethodField() def get_time_since_publication(self, object): publication_date = object.publication_date now = datetime.now() time_delta = timesince(publication_date, now) return time_delta def validate(self, data): """Check that description and title are different""" if data["title"] == data["description"]: raise serializers.ValidationError("Title and Description must be different from one another") return data def validate_title(self, value): if len(value) < 60: raise serializers.ValidationError("The title has to be at least 60 charactor") return value class Meta: model = Article exclude = ("id", ) |
ブラウザをリロードして、Contentに以下のデータを入力し、POSTを押してください。
1 2 3 4 5 6 7 8 9 10 |
{ "time_since_publication": "1 week", "author": "selfnote", "title": "ModelSerializer", "description": "^^", "body": "this is a first post", "location": "tokyo", "publication_date": "2020-05-22", "active": true } |


OKですね。
次回
次回は、シリアライズクラスと関連データについて学びます。
関連記事
こちらもどうぞ
Djangoおすすめ書籍
Djangoを学ぶなら以下の書籍がオススメです。
緑 -> 赤 -> 紫の順でやればOKです。読みやすい英語で書かれているので、英語力もついでに上がるかもしれません^^
コメントを残す
コメントを投稿するにはログインしてください。