【超初心者向け】Djangoのシリアライズって? 〜データ変換の基礎〜
シリアルといえば、ケロッグのチョコワ派でした。
こんにちは、
ワニかず@40歳 出戻りエンジニアです。
あのパッケージのゾウのキャラクターって
なんでリストラされちゃったんでしょうね。
ということで、私もリストラされないように
DjangoのWebAPIについて勉強していたのですが、
シリアライズ(Serialization)についての理解が必要になったため、調べたことをまとめました。
シリアライズとは
シリアライズとは、
プログラム上のデータ(オブジェクト)を、保存や通信で使える形式に変換することです。
具体例
カレンダーに登録されたイベントをWebAPIとして通知する例で説明していきます。
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形式のデータに変換(シリアライズ)するためのシリアライザクラスを定義しています。具体的に説明すると、
-
CalendarEventSerializer
はserializers.ModelSerializer
を継承しています-
ModelSerializer
は、Djangoモデルを簡単にシリアライズできる基本クラスです
-
-
Meta
クラスでシリアライザの設定を定義しています:-
model = CalendarEvent
:シリアライズ対象のモデルを指定 -
fields = ['id', 'title', 'description', 'start_date', 'end_date']
:変換対象のフィールドを指定
-
このシリアライザの主な用途:
- APIエンドポイントでカレンダーイベントデータをJSONとして返す
- クライアントから送信されたJSONデータをDjangoモデルのインスタンスに変換する
- バリデーション(データの検証)を行う
- 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
- シリアライズ後のデータ(JSON形式)
{
"id": 1,
"title": "週次ミーティング",
"description": "営業部門の週次MTG",
"start_date": "2024-02-01T10:00:00",
"end_date": "2024-02-01T11:00:00"
}
なぜシリアライズが必要か?
-
Web APIでの利用
- フロントエンド(JavaScriptなど)はDjangoのオブジェクトを直接理解できない
- JSONのような標準的なフォーマットに変換する必要がある
-
データの保存
- ファイルやキャッシュにデータを保存する際に使用
- 異なるシステム間でデータをやり取りする際に必要
DjangoのModelSerializerの便利な点
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の利点:
- コードが簡潔になる
- データの検証(バリデーション)機能が含まれる
- JSONからDjangoモデルへの変換(逆シリアライズ)も自動的に処理
- 日付や時間の形式変換を自動的に処理
つまり、シリアライズとは「Djangoのデータを他のシステムでも使える形式に変換すること」で、ModelSerializerは「その変換作業を簡単に行えるようにする機能」だと理解していただければと思います。
JSON以外の形式
シリアライズには、JSONの他にもいくつかの一般的なデータ形式があります。
主な形式を比較してみましょう。
- JSON (JavaScript Object Notation)
{
"title": "週次ミーティング",
"start_date": "2024-02-01T10:00:00"
}
特徴:
- 最も一般的で広く使われている
- 人間が読みやすい
- Webブラウザとの相性が良い
- データ構造が比較的シンプル
- XML (Extensible Markup Language)
<event>
<title>週次ミーティング</title>
<start_date>2024-02-01T10:00:00</start_date>
</event>
特徴:
- より詳細なデータ構造を表現できる
- 古いシステムでよく使用されている
- JSONより冗長になりがち
- SOAP APIなどで使用
- YAML (YAML Ain't Markup Language)
title: 週次ミーティング
start_date: 2024-02-01T10:00:00
特徴:
- 最も人間が読みやすい
- 設定ファイルでよく使用
- インデントが重要
- Kubernetes等の設定ファイルで人気
- 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が最も一般的に使用される理由:
- JavaScriptとの相性が良い(ブラウザでの使用が容易)
- シンプルで理解しやすい
- ほとんどのプログラミング言語でサポートされている
- WebAPIの事実上の標準となっている
Discussion