【发布时间】:2018-07-14 02:27:41
【问题描述】:
概述
我正在使用 Flask-SqlAlchemy,现在我正在研究 marshmallow 来帮助我序列化和反序列化请求数据。
我成功了:
使用 Flask-SqlAlchemy
创建我的模型
使用 Flask-Marshmallow 使用同一模型序列化数据库对象,方法是使用 Optional Flask-SqlAlchemy Integration
使用 marshmallow-jsonapi 快速生成符合 Json API 的响应。这需要我 declare new Schemas 指定我想要包含的属性(这是重复的 Flask-SqlAlchemy 模型)
代码示例
Flask-SqlAlchemy 声明模型
class Space(db.Model):
__tablename__ = 'spaces'
id = sql.Column(sql.Integer, primary_key=True)
name = sql.Column(sql.String)
version = sql.Column(sql.String)
active = sql.Column(sql.Boolean)
flask_marshmallow Schema 声明(继承自 SqlAlchemy 模型)
ma = flask_marshmallow.Marshmallow(app)
class SpaceSchema(ma.ModelSchema):
class Meta:
model = Space
# API Response
space = Space.query.first()
return SpaceSchema().dump(space).data
# Returns:
{
'id': 123,
'version': '0.1.0',
'name': 'SpaceName',
'active': True
}
marshmallow_json api - 需要新的 Schema 声明,必须手动包含每个属性和类型
class SpaceJsonSchema(marshmallow_json.Schema):
id = fields.Str(dump_only=True)
name = fields.Str()
version = fields.Str()
active = fields.Bool()
class Meta:
type_ = 'spaces'
self_url = '/spaces/{id}'
self_url_kwargs = {'id': '<id>'}
self_url_many = '/spaces/'
strict = True
# Returns Json API Compliant
{
'data': {
'id': '1',
'type': 'spaces',
'attributes': {
'name': 'Phonebooth',
'active': True,
'version': '0.1.0'
},
'links': {'self': '/spaces/1'}
},
'links': {'self': '/spaces/1'}
}
问题
如代码所示,marshmallow-jsonapi 允许我创建符合 json api 的响应,但我最终不得不维护声明模型 + 模式响应模型。
flask-marshmallow 允许我从 SqlAlchemy 模型创建 Schema 响应,因此我不必为每个模型维护一组单独的属性。
问题
是否可以同时使用 flask-marshmallow 和 marshmallow-jsonapi 1. 从 SqlAlchemy 模型创建 Marshmallow Schema,AND 自动生成 json api 响应?
我尝试创建继承自 ma.ModelSchema 和 marshmallow_json.Schema 的 Schema 声明,在两个命令中,但它不起作用(引发缺少方法和属性的异常)
marshmallow-jsonapi
marshmallow-jsonapi 提供了一种生成 JSON 的简单方法 任何 Python Web 框架中的 API 兼容数据。
flask-marshmallow
Flask-Marshmallow 包含有用的附加功能,可与 Flask-SQLAlchemy 和 marshmallow-sqlalchemy。
【问题讨论】:
-
看起来你可以在 python 中做一些多重继承,即
class MyClass(Schema, SQLAlchemyAutoSchema):docs.sqlalchemy.org/en/13/orm/extensions/declarative/… 我现在也在努力让它工作 -
看起来其他人已经这样做了...stackoverflow.com/a/53035144
标签: python flask flask-sqlalchemy marshmallow