0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[DRF]Serializerって何やってるのか

Last updated at Posted at 2024-07-31

Serializerとは

Djangoの勉強をすると出てくる(正確にはDjango REST framework)シリアライザーさん。


書き方がスッキリしててわかりやすいのですが、なんとなくブラックボックス的でもあるので自分の勉強のまとめとして記事を書きます。

Serializerの役割

簡単にいうとモデルに格納するとか、viewsでリクエストを処理するとかそういう時に呼び出されています。

もう少し具体的にいうと
Pythonオブジェクト(models.pyの記述とか)→JSONやXMLなどに変換
という役割を担っています。

APIとの関係について

APIとどのような関係で動くか、と考えるとわかりやすいです。

データの出力

データベースからデータを取得し、そのデータをserializerに渡します。その際、前述のようにオブジェクトからJSONなどの形式に変換してAPIレスポンスとして返します。

データの入力

APIで入力を受け付けた後、serializerはそのデータの検証を行なってデータベースへの保存を行います。

実際にどういう感じで定義していくのか、例を示します。

models.py
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、価格を保存します。

serializers.py

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__としても同一の内容になる。

参考文献

Django REST framework - Serializers

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?