2020年8月1日土曜日

Flask-Marshmallow でカスタムフィールドを追加する方法

概要

Flask-Marshmallow を使って独自のカラム名を返却するようなスキーマを定義する方法を紹介します

環境

  • macOS 10.15.5
  • MySQL 8.0.19
  • Python 3.8.3
  • Flask-Migrate 2.5.3
  • Flask-SQLAlchemy 2.5.3
  • Flask-Marshmallow 0.13.0

スキーマ定義

ma.Integerma.String という感じで SQLAlchemy の fields と同じような定義ができます

class UserCustomSchema(ma.Schema):
    my_id = ma.Integer(attribute="id")
    my_name = ma.String(attribute="name")

attribute 引数を使うことで元々のカラム名を指定します

使い方

Flask と組み合わせて使う方法です
クエリを発行したあとで定義しておいたカスタムフィールドだけが返るスキーマで dump します

class UserCRUD():
  def custom_select(self):
      return UserCustomSchema(many=True).dump(User.query.all())

あとは Flask からアクセスするようにすれば OK です

from flask import Flask, jsonify
from flask_migrate import Migrate
from my_app.database import db, ma
from my_app.lib import UserCRUD

app = Flask(__name__)
app.debug = True
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqldb://root:@localhost/test?charset=utf8"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True

db.init_app(app)
migrate = Migrate(app, db)
ma.init_app(app)

@app.route('/custom')
def custom_select():
    crud = UserCRUD()
    user = crud.custom_select()
    return jsonify(user)

これで確認すると [{"my_id":1,"my_name":"a"},{"my_id":2,"my_name":"b"},{"my_id":3,"my_name":"c"}] こんな感じでカスタムフィールドのみが記載されたレスポンスになってるのが確認できると思います

最後に

Flask-Marshmallow で既存のカラム名を使わずカスタムでレスポンスとして返却するカラム名を指定する方法を紹介しました
他にも指定可能な型やカスタムできる項目はあるのでスキーマの定義だけでレスポンスの形を制御できるのは便利な機能です

参考サイト

0 件のコメント:

コメントを投稿