Serializerとは
Djangoの勉強をすると出てくる(正確にはDjango REST framework)シリアライザーさん。
書き方がスッキリしててわかりやすいのですが、なんとなくブラックボックス的でもあるので自分の勉強のまとめとして記事を書きます。
Serializerの役割
簡単にいうとモデルに格納するとか、viewsでリクエストを処理するとかそういう時に呼び出されています。
もう少し具体的にいうと
Pythonオブジェクト(models.pyの記述とか)→JSONやXMLなどに変換
という役割を担っています。
APIとの関係について
APIとどのような関係で動くか、と考えるとわかりやすいです。
データの出力
データベースからデータを取得し、そのデータをserializerに渡します。その際、前述のようにオブジェクトからJSONなどの形式に変換してAPIレスポンスとして返します。
データの入力
APIで入力を受け付けた後、serializerはそのデータの検証を行なってデータベースへの保存を行います。
例
実際にどういう感じで定義していくのか、例を示します。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
publication_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)
price = models.DecimalField(max_digits=6, decimal_places=2)
著者データと書籍データを格納するテーブルを定義しています。
著者データは名前とEメール、書籍データはタイトル、著者(Autherのテーブルの外部キーでもある)、出版日、ISBN、価格を保存します。
from rest_framework import serializers
from .models import Author, Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date', 'isbn', 'price']
class AuthorSerializer(serializers.ModelSerializer):
books = BookSerializer(many=True, read_only=True, source='book_set')
class Meta:
model = Author
fields = ['id', 'name', 'email', 'books']
これでAPIをつかって書籍のデータと著者データを呼び出すことができる。
AuthorSerializerクラスでbooks = BookSerializer~~として呼び出していて、さらにsource='book_set'としているので、Authorモデルから逆参照をすることができます。そのため著者データを呼び出した時には著者の書籍情報が併せて取得されます。(複数の著書がある場合を考慮してmany=True)になっています。
たとえば、下のような感じのデータで取得することができます。
{
"id": 1,
"name": "ATOM00",
"email": "atom@example.com",
"books": [
{
"id": 1,
"title": "本タイトル",
"publication_date": "2024-07-31",
"isbn": "0000000000",
"price": "1000"
},
// 他の本のデータ...
]
}
ちなみにfieldsの記述方法については、今回全てのフィールドを呼び出してるのでfields = __all__
としても同一の内容になる。