当サイトは、アフィリエイト広告を利用しています
PythonのFastApiでREST APIをを実装する際等は
データを
の3つの形を意識して扱う必要がある。
この3つのデータの変換方法をまとめて忘備録として残す。
FastApiはPydanticをネイティブに統合しているため
特にimportなしで、シリアライズ・デシリアライズを行うことができる。
※FlaskでもPydanticをインストールすれば可能
pydanticに関しては下記記事で紹介しています
シリアライズはモデルのインスタンスを「辞書」や「JSON」などの形式に変換すること
データモデルインスタンスから辞書型に変換する場合は
を使う。
from pydantic import BaseModel# データモデルクラスを定義class User(BaseModel):user_id: intname: strage: int# データモデルのインスタンス生成user = User(user_id=1, name="Charlie", age=40)# データモデル自体の型を確認print(f"ユーザモデルの型: {type(user)}")# 出力: ユーザモデルの型: <class '__main__.User'># シリアライズ: データモデルインスタンスを辞書に変換user_dict = user.model_dump()print(user_dict)print(f"型: {type(user_dict)}") # 型を出力# 出力: {'user_id': 1, 'name': 'Charlie', 'age': 40}# 型: <class 'dict'>
データモデルインスタンスを辞書に変換できる。
下記のようにdictを使ってもできるが非推奨なので、model_dump()を使うようにする
# シリアライズ: データモデルインスタンスを辞書に変換user_dict = user.dict
VSCodeでは警告になる。
データモデルインスタンスからJSON文字列にする場合は
を使う。
from pydantic import BaseModel# データモデルクラスを定義class User(BaseModel):user_id: intname: strage: int# データモデルのインスタンス生成user = User(user_id=1, name="Charlie", age=40)# シリアライズ: PydanticモデルをJSON形式に変換user_json = user.model_dump_json()print(user_json)print(f"型: {type(user_json)}") # 型を出力# 出力: {"user_id": 1, "name": "Charlie", "age": 40}# 型: <class 'str'>
データモデルインスタンスをJSONに変換できる
辞書からJSONに変換する場合はPython標準のjsonをimportして
を使う
import jsonfrom pydantic import BaseModel# データモデルクラスを定義class User(BaseModel):user_id: intname: strage: int# データモデルのインスタンス生成user = User(user_id=1, name="Charlie", age=40)# データモデル自体の型を確認print(f"ユーザモデルの型: {type(user)}")# 出力: ユーザモデルの型: <class '__main__.User'># シリアライズ: データモデルインスタンスを辞書に変換user_dict = user.model_dump()print(user_dict)print(f"型: {type(user_dict)}") # 型を出力# 出力: {'user_id': 1, 'name': 'Charlie', 'age': 40}# 型: <class 'dict'># シリアライズ: 辞書をJSONに変換json_dict = json.dumps(user_dict)print(json_dict)print(f"型: {type(json_dict)}") # 型を出力# 出力: {"user_id": 1, "name": "Charlie", "age": 40}# 型: <class 'str'>
あまり使うことは少ないかもしれない
シリアライズとは逆で「辞書」や「JSON」などのデータ形式からPydanticのモデルにデータを読み込む
from pydantic import BaseModel# Pydanticデータモデルclass User(BaseModel):user_id: intname: strage: int# 辞書を使ったデシリアライズ(バリデーションを伴う)user_data = {"user_id": 1, "name": "Charlie", "age": 40}validated_user = User(**user_data) # デシリアライズprint(validated_user)print(f"型: {type(validated_user)}") # 型を出力# 出力: user_id=1 name='Charlie' age=40# 型: <class '__main__.User'>
辞書に対してバリデーションを実行すると同時にデータモデルインスタンスに変換する。
バリデーションに成功すると、データモデルインスタンスが返却される
※失敗すると例外が発生する
from pydantic import BaseModel# Pydanticデータモデルclass User(BaseModel):user_id: intname: strage: int# JSON文字列を使ったデシリアライズ(バリデーションを伴う)user_json = '{"user_id": 2, "name": "Alice", "age": 30}'validated_user_from_json = User.model_validate_json(user_json) # デシリアライズprint(validated_user_from_json)print(f"型: {type(validated_user_from_json)}") # 型を出力# 出力: user_id=2 name='Alice' age=30# 型: <class '__main__.User'>
JSON文字列に対してバリデーションを実行すると同時にデータモデルインスタンスに変換する。
バリデーションに成功すると、データモデルインスタンスが返却される
※失敗すると例外が発生する
辞書からJSONに変換する場合はpython標準のjsonをimportして使う
import jsonfrom pydantic import BaseModel# Pydanticデータモデルclass User(BaseModel):user_id: intname: strage: int# JSON文字列を使ったデシリアライズuser_json = '{"user_id": 2, "name": "Alice", "age": 30}'user_dict = json.loads(user_json)print(user_dict)print(f"型: {type(user_dict)}") # 型を出力# 出力: {'user_id': 2, 'name': 'Alice', 'age': 30}# 型: <class 'dict'>
上記のシリアライズやデシリアライズはfastApiを使っている場合は
pydanticのインストールは不要だが、Flaskの場合はpydanticのインストールが必要になる。
REST APIを実装する際に返却時のデータ型を意識する必要があり、
それぞれの変換方法を忘れるのでまとめておいた。
FastApiでREST APIを作る時はデータ型によってはバリデーションが
実行されなかったりするので注意が必要。
その辺は
下記記事で書いてます