使用 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 值。