SQLAlchemy x marshmallowでModelからJSONへの変換を楽に行う

Python, SQLAlchemy

Flask-SQLAlchemyを使用したAPIを作成していてDBから取得したModelをJSONに変換しようとすると、
SQLAlchemyのModelはそのままJSONに変換できないので何かに詰め替えを行う必要があります。

pythonのmarshmallowというライブラリは、
pythonオブジェクトをJSONに変換したりその逆を行ったりするためのスキーマを定義するためのライブラリです。

今回は、marshmallowを使用してSQLAlchemyのModelをJSONに変換するためのスキーマを定義します。

実装例

使用例

出力結果

解説

SQLAlchemyでuserテーブルのModelを定義します。
5つのカラム(id,first_name,last_name,created_at,updated_at)を作成します。

marshmallowでModelSchemaを定義します。
SQLAlchemyのModelの場合は以下のようにclass Metaで指定するだけで完了です。

ここまでを使ってSQLAlchemyで取得したオブジェクトを変換すると

以下のようなJSONが得られます。

ここで問題になるのが、MarshmallowのDateTime型が自動でUTCに変換されてしまう点です。
"2017-08-19T19:50:39+00:00"

そのため、日付フォーマットを指定してあげる必要があります。
以下のように書くことでプロパティを上書きできるようです。

また、Modelにないプロパティを追加したい場合もあります。
例えばカスタムフィールドのMethod Fieldsを使用すると
以下のように元のModelを加工したプロパティを追加することができます。

また、Schemaのインスタンス生成時に excludeを使用することで不要なプロパティを削除できます。

以下のようなJSONが得られます。

その他、スキーマの定義を行えばリレーションのあるテーブルを一緒に取って来ることもできたりします。
Marshmallowを知るまではSQLAlchemyのModelからJSON変換用のクラスを作成して詰め替えていたのですが、
単純な詰め替え作業は少ないコードで書けて拡張性もあるので便利かと思います。

Python, SQLAlchemy