使用 SQLAlchemyAutoSchema 在 flask-marshmallow 模式 class 中访问模型道具
accesing model props in flask-marshmallow schema class with SQLAlchemyAutoSchema
我有一个简单的数据库模型,它引用自身来创建层次结构。
现在我想构建一个 RESTapi,使用 Flask,Flask-SQLAlchemy 和 Flask-marshmallow。
为了方便起见,我从 ma.SQLAlchemyAutoSchema
继承了我的 Schema-classes(其中 ma
是 flask-marshmallow 的实例)
如果模型有 children,我希望我的端点 return 类别 object,包括 link 到 return 的端点children。 (效果很好。)但如果模型没有 children,则不应包括 link。
我的直觉告诉我,您可以而且可能应该直接在模式定义中设置它。
#model.py
from app import db
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
parent_id = db.Column(db.Integer, db.ForeignKey("category.id", ondelete="SET NULL"))
children = db.relationship("Category",
backref=db.backref('parent', remote_side=[id]),
lazy="dynamic")
#schema.py
from app import model, ma, db
class CategorySchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = model.Category
_links = ma.Hyperlinks({
'children': ma.URLFor('api.category_children', equipment_id="<id>")
if model.Category.query.filter_by(id=??????).first().children.first() else None
})
我想到了上面的简单三元赋值,但我不知道从哪里获取 id (id=??????
),(这与 ma.URLFor()
访问的 id 完全相同通过 equipment_id="<id>"
).
预期示例输出,如果 children 存在
{
"_links": {
"children": "/api/v1/category/1/children"
},
"id": 1,
"name": "some_name"
}
预期示例输出,如果不存在 children:
{
"_links": {
"children": null
},
"id": 1,
"name": "some_name"
}
提前致谢
我认为您的设计过度工程化了。刚刚拥有:
class CategorySchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = model.Category
_links = ma.Hyperlinks({
'children': ma.URLFor('api.category_children', equipment_id="<id>")
})
应该没问题。如果 Parent 没有 Children,那么命中 "/api/v1/category/1/children"
的端点(在您的示例中)应该只是 return 一个空结果集。您不需要按照您描述的方式控制导航 link。 HATEOAS 设计的期望是您应该能够通过资源一致地导航到所需的端点。必须处理 link 的 null
值而不是空结果,IMO 会让自己很头疼。
否则,如果你真的want/need到。 post_dump
decorator 应该可以让您找到 id
值。
我有一个简单的数据库模型,它引用自身来创建层次结构。
现在我想构建一个 RESTapi,使用 Flask,Flask-SQLAlchemy 和 Flask-marshmallow。
为了方便起见,我从 ma.SQLAlchemyAutoSchema
继承了我的 Schema-classes(其中 ma
是 flask-marshmallow 的实例)
如果模型有 children,我希望我的端点 return 类别 object,包括 link 到 return 的端点children。 (效果很好。)但如果模型没有 children,则不应包括 link。
我的直觉告诉我,您可以而且可能应该直接在模式定义中设置它。
#model.py
from app import db
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
parent_id = db.Column(db.Integer, db.ForeignKey("category.id", ondelete="SET NULL"))
children = db.relationship("Category",
backref=db.backref('parent', remote_side=[id]),
lazy="dynamic")
#schema.py
from app import model, ma, db
class CategorySchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = model.Category
_links = ma.Hyperlinks({
'children': ma.URLFor('api.category_children', equipment_id="<id>")
if model.Category.query.filter_by(id=??????).first().children.first() else None
})
我想到了上面的简单三元赋值,但我不知道从哪里获取 id (id=??????
),(这与 ma.URLFor()
访问的 id 完全相同通过 equipment_id="<id>"
).
预期示例输出,如果 children 存在
{
"_links": {
"children": "/api/v1/category/1/children"
},
"id": 1,
"name": "some_name"
}
预期示例输出,如果不存在 children:
{
"_links": {
"children": null
},
"id": 1,
"name": "some_name"
}
提前致谢
我认为您的设计过度工程化了。刚刚拥有:
class CategorySchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = model.Category
_links = ma.Hyperlinks({
'children': ma.URLFor('api.category_children', equipment_id="<id>")
})
应该没问题。如果 Parent 没有 Children,那么命中 "/api/v1/category/1/children"
的端点(在您的示例中)应该只是 return 一个空结果集。您不需要按照您描述的方式控制导航 link。 HATEOAS 设计的期望是您应该能够通过资源一致地导航到所需的端点。必须处理 link 的 null
值而不是空结果,IMO 会让自己很头疼。
否则,如果你真的want/need到。 post_dump
decorator 应该可以让您找到 id
值。