我有一个简单的db模型,它引用自己来创建一个层次结构。现在我想使用Flask、Flask-SQLAlchemy和Flask- RESTapi构建一个棉花糖。为了方便起见,我从ma.SQLAlchemyAutoSchema继承了模式类(其中ma是flask-marshmallow的实例)
如果模型有子对象,我希望我的端点返回类别对象,包括一个指向返回子对象的端点的链接。(它工作得很好。)但如果模型没有子项,则不应包含该链接。
我的直觉告诉我,您可以而且可能应该直接在模式定义中设置它。
#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()通过equipment_id="<id>"访问的id )。
预期的示例输出,如果存在子级
{
"_links": {
"children": "/api/v1/category/1/children"
},
"id": 1,
"name": "some_name"
}如果不存在子级,则预期示例输出:
{
"_links": {
"children": null
},
"id": 1,
"name": "some_name"
}提前谢谢你
发布于 2021-03-24 06:29:16
我认为你过度设计了你的设计。只是拥有:
class CategorySchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = model.Category
_links = ma.Hyperlinks({
'children': ma.URLFor('api.category_children', equipment_id="<id>")
})应该没问题。如果父对象没有子对象,那么命中"/api/v1/category/1/children"的端点(在您的示例中)应该只返回一个空的结果集。您不应该需要控制它们所描述的导航链接。HATEOAS设计的期望是您应该能够一致地通过资源导航到所需的端点。必须处理一个链接的null值而不是一个空的结果,这让你很头疼。
否则,如果你真的想/需要的话。post_dump decorator应为您提供查找id值的权限。
https://stackoverflow.com/questions/66764699
复制相似问题