概要
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.Integer
や ma.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 件のコメント:
コメントを投稿