PythonでWebアプリ作成にあたり、DjangoおよびDjango Rest Frameworkの勉強を進めている方も多いと思います。
私は未経験から勉強し、現在はサーバーサイドエンジニアとして働いていますが、当時プログラミング学習には結構苦労しました。
特にDjango Rest FrameworkのSerializer(シリアライザ)については、今でも少し混乱することがあります。
今回は自分用のメモも兼ねて、DRFのSerializerについて使い方の簡単な説明を書いていきます。
走り書き程度なので厳密ではない箇所もあるかと思いますが、少しでも参考になればと思います。
PythonとDjangoの関係性
DjangoはPythonで作成されたWebフレームワークの一つ。
Webフレームワークとは、Webアプリ開発をする際に開発の効率を上げる(簡単に開発ができる)ための便利な機能が詰まったツールのことです。
プロフェッショナルな誰かが作ってくれたフレームワークを使うことで、自分のような初学者エンジニアでも比較的容易にWebアプリを作成することができます。
Djangoは、PythonのWebフレームワークで最も有名なフレームワークのうちの一つですが、他にもBottle、Flaskなどが有名ですね。
備わっている機能等が異なるので、作りたいアプリによってフレームワークを選定する必要があります。
Django Rest Frameworkとは
Django Rest Framework(ジャンゴレストフレームワーク)は、Djangoを利用してAPIを実装するためのライブラリの一つ。
データベースから必要なデータを取り出し、JSONでレスポンスを返却することが主な目的です。
フロントサーバーとのやりとりにはJSONを使用することが多いため、よく使用されるライブラリです。
Django Rest FrameworkにはSerializerと呼ばれる機能があり、使いこなせると非常に便利です。
以下で少し解説します。
Model(モデル)
Serializerの説明をするにあたり、DjangoのModelについて簡単に記述します。
※以下、DBはデータベースの略称
下記は、IDと名前の情報を持ったBook(本)テーブルの定義です。
from django.db import models
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
- 1モデルクラス(Bookクラス)がDBの1テーブル(Bookテーブル)と対応する
- 1クラス変数(name)がDBの1カラムと対応する
DBからデータを取り出す際、モデルクラスに対してモデル名.objects.〜でクエリを実行します。
# Bookテーブル内の全件取得
books = Book.objects.all()
booksの中身はqueryset(クエリセット=Bookインスタンスの配列)になります。
# Bookテーブル内の条件に合う複数件取得
book = Book.objects.filter(name="シャーロックホームズの大冒険")
bookの中身はqueryset(クエリセット=Bookインスタンスの配列)になります。
# Bookテーブル内の1件取得
book = Book.objects.get(id=1)
bookの中身はBookインスタンス(=モデルインスタンス)になります。
Bookインスタンスから値を取得する場合、以下のように記述します。
# IDが1の本の、名前を取得
book = Book.objects.get(id=1)
book_name= book.name
Serializer(シリアライザ)
ここが今回一番の目玉ですが、そもそもシリアライザとは一体何でしょう。
serialize(シリアライズ)は、直訳すると「直列化」です。
直列とは、ここではいわゆる「JSON」形式のことを指します。
JSONは、データ交換を行うためのデータ記述形式の一種で、インデントや改行に依存しないデータ構造になっています。つまり、超シンプルな形式です。
例えば下記のような構造です。
{"response":[{"id":"1","name":"シャーロックホームズの大冒険"}]}
上記を踏まえると、Serializer(シリアライザ)は「JSON化をおこなうクラス」ということになります。
しかし、Serializerは厳密には(スムーズにJSONへ変換できる)Pythonの辞書型に変換するものです。
下記では、HogeSerializerを通す事でモデルインスタンスがpythonの辞書型に変換され、
その後、json.dump()で辞書形式からJSON形式へ変換しています。
import json
data = HogeSerializer(model_instance).data # シリアライズされたデータが辞書形式でdataに格納される
json.dump(data) # 辞書形式のデータがJSON形式に変換される
また、シリアライズの反対、deserialize(デシリアライズ)の役割をするserializerもあります。
シリアライズはインスタンスやクエリセットを辞書型に変換するのに対し、デシリアライズはPythonの辞書型で表現されたデータをモデルインスタンスに変換することを指します。
# シリアライズ(モデルインスタンス -> 辞書形式)
serializer = HogeSerializer(model_instance)
data = serializer.data
# デシリアライズ(辞書形式 -> モデルインスタンス)
serializer = HogeSerializer(data=data)
if serializer.is_valid():
model_instance = serializer.save()
シリアライズはListやRetrieveで、デシリアライズはCreateやUpdateで使用されることが多いです。
つまり、serializerは、シリアライズとデシリアライズどちらの役割も担うということなので、ここは認識しておきましょう。
また、シリアライザを利用することで、簡単にバリデーションをかけることも可能です。
例えば、下記ではemailフィールドに”example.com”が入っていなかった場合エラーを返却します。
from rest_framework import serializers
class HogeSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
age = serializers.IntegerField(min_value=0, max_value=120)
email = serializers.EmailField()
def validate(self, data):
if "example.com" not in data['email']:
raise serializers.ValidationError("Email must be from example.com domain")
return data
未経験からプログラミングを学ぶ方法について
私は大学では文系の学部を卒業し、社会人になってからも数年間は営業や管理部門といった仕事に就いていました。
もちろん、情報系やプログラミングといった類の勉強は一切してきませんでした。
こんな私でも、現在はWeb系のバックエンドエンジアとして働くことができています。
未経験からプログラミングを学び、Webエンジニアになった経緯と手順については、現在執筆中ので少々お待ちください。実体験や生の声に基づくおすすめの転職サービスやスクールなども合わせて紹介していきます。
特に、下記のような方には参考になるかと思います。
・プログラミングをゼロから学びたい方
・未経験からITエンジニアへの転職を検討している方
また、エンジニアとして働く前に読んでおいて良かった本についてはこちらの記事に書いています。
あわせてご確認いただけると、より参考になると思います。
プログラミングは、正しく学べば誰でも習得できる、需要だらけのお得スキルセットです。
挫折しそうになることもあると思いますが(体験済)、もう一踏ん張りがんばって進めてみましょう!