🐘

【超初心者向け】Djangoのシリアライズって? 〜データ変換の基礎〜

2025/02/09に公開

シリアルといえば、ケロッグのチョコワ派でした。
こんにちは、
ワニかず@40歳 出戻りエンジニアです。

あのパッケージのゾウのキャラクターって
なんでリストラされちゃったんでしょうね。

ということで、私もリストラされないように
DjangoのWebAPIについて勉強していたのですが、
シリアライズ(Serialization)についての理解が必要になったため、調べたことをまとめました。

シリアライズとは

シリアライズとは、
プログラム上のデータ(オブジェクト)を、保存や通信で使える形式に変換することです。

具体例

カレンダーに登録されたイベントをWebAPIとして通知する例で説明していきます。

python
from rest_framework import serializers
from .models import CalendarEvent

class CalendarEventSerializer(serializers.ModelSerializer):
    class Meta:
        model = CalendarEvent
        fields = ['id', 'title', 'description', 'start_date', 'end_date']

このコードは、Django REST Frameworkを使用して、CalendarEventモデルをJSON形式のデータに変換(シリアライズ)するためのシリアライザクラスを定義しています。具体的に説明すると、

  1. CalendarEventSerializerserializers.ModelSerializerを継承しています

    • ModelSerializerは、Djangoモデルを簡単にシリアライズできる基本クラスです
  2. Metaクラスでシリアライザの設定を定義しています:

    • model = CalendarEvent:シリアライズ対象のモデルを指定
    • fields = ['id', 'title', 'description', 'start_date', 'end_date']:変換対象のフィールドを指定

このシリアライザの主な用途:

  • APIエンドポイントでカレンダーイベントデータをJSONとして返す
  • クライアントから送信されたJSONデータをDjangoモデルのインスタンスに変換する
  • バリデーション(データの検証)を行う
  1. Djangoでのデータの状態
# データベースから取得したカレンダーイベント
event = CalendarEvent.objects.get(id=1)

# このeventは以下のようなデータを持つPythonオブジェクト
event.id = 1
event.title = "週次ミーティング"
event.description = "営業部門の週次MTG"
event.start_date = datetime(2024, 2, 1, 10, 0)  # 2024年2月1日 10:00
event.end_date = datetime(2024, 2, 1, 11, 0)    # 2024年2月1日 11:00
  1. シリアライズ後のデータ(JSON形式)
{
    "id": 1,
    "title": "週次ミーティング",
    "description": "営業部門の週次MTG",
    "start_date": "2024-02-01T10:00:00",
    "end_date": "2024-02-01T11:00:00"
}

なぜシリアライズが必要か?

  1. Web APIでの利用

    • フロントエンド(JavaScriptなど)はDjangoのオブジェクトを直接理解できない
    • JSONのような標準的なフォーマットに変換する必要がある
  2. データの保存

    • ファイルやキャッシュにデータを保存する際に使用
    • 異なるシステム間でデータをやり取りする際に必要

DjangoのModelSerializerの便利な点

python
class CalendarEventSerializer(serializers.ModelSerializer):

と、CalendarEventSerializerクラスは
serializers.ModelSerializerクラスを継承していますが、

# ModelSerializerを使用しない場合(手動でシリアライズする)
def manual_serialize_event(event):
    return {
        'id': event.id,
        'title': event.title,
        'description': event.description,
        'start_date': event.start_date.isoformat(),
        'end_date': event.end_date.isoformat()
    }

# ModelSerializerを使用する場合
class CalendarEventSerializer(serializers.ModelSerializer):
    class Meta:
        model = CalendarEvent
        fields = ['id', 'title', 'description', 'start_date', 'end_date']

# 使用方法
serializer = CalendarEventSerializer(event)
serialized_data = serializer.data  # 自動的に適切な形式に変換される

ModelSerializerの利点:

  1. コードが簡潔になる
  2. データの検証(バリデーション)機能が含まれる
  3. JSONからDjangoモデルへの変換(逆シリアライズ)も自動的に処理
  4. 日付や時間の形式変換を自動的に処理

つまり、シリアライズとは「Djangoのデータを他のシステムでも使える形式に変換すること」で、ModelSerializerは「その変換作業を簡単に行えるようにする機能」だと理解していただければと思います。

JSON以外の形式

シリアライズには、JSONの他にもいくつかの一般的なデータ形式があります。
主な形式を比較してみましょう。

  1. JSON (JavaScript Object Notation)
{
    "title": "週次ミーティング",
    "start_date": "2024-02-01T10:00:00"
}

特徴:

  • 最も一般的で広く使われている
  • 人間が読みやすい
  • Webブラウザとの相性が良い
  • データ構造が比較的シンプル
  1. XML (Extensible Markup Language)
<event>
    <title>週次ミーティング</title>
    <start_date>2024-02-01T10:00:00</start_date>
</event>

特徴:

  • より詳細なデータ構造を表現できる
  • 古いシステムでよく使用されている
  • JSONより冗長になりがち
  • SOAP APIなどで使用
  1. YAML (YAML Ain't Markup Language)
title: 週次ミーティング
start_date: 2024-02-01T10:00:00

特徴:

  • 最も人間が読みやすい
  • 設定ファイルでよく使用
  • インデントが重要
  • Kubernetes等の設定ファイルで人気
  1. Protocol Buffers (protobuf)
message Event {
  string title = 1;
  string start_date = 2;
}

特徴:

  • Googleが開発したバイナリ形式
  • 非常に高速で効率的
  • データサイズが小さい
  • 人間が読むのは難しい

現在の一般的な使用傾向:

  • Web API → JSONが最も一般的
  • 設定ファイル → YAMLやJSON
  • 高性能が必要な場合 → Protocol Buffers
  • レガシーシステム連携 → XML

Djangoのserializersは、デフォルトではJSONを使用しますが、他の形式にも対応可能です:

# XMLシリアライザの例
from rest_framework_xml.renderers import XMLRenderer

class CalendarEventViewSet(viewsets.ModelViewSet):
    renderer_classes = [XMLRenderer]  # XMLとして出力
    serializer_class = CalendarEventSerializer

JSONが最も一般的に使用される理由:

  1. JavaScriptとの相性が良い(ブラウザでの使用が容易)
  2. シンプルで理解しやすい
  3. ほとんどのプログラミング言語でサポートされている
  4. WebAPIの事実上の標準となっている

Discussion