0

我有一个简单的数据库模型,它引用自身,以创建层次结构。现在我想构建一个 RESTapi,使用 Flask、Flask-SQLAlchemy 和 Flask-marshmallow。为方便起见,我继承了我的模式类ma.SQLAlchemyAutoSchema(flask-marshmallow 的实例在哪里ma

如果模型有孩子,我希望我的端点返回类别对象,包括指向返回孩子的端点的链接。(效果很好。)但如果模型没有孩子,则不应包含链接。

我的直觉告诉我,您可以并且可能应该直接在模式定义中设置它。

#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()via 访问的 id 完全相同equipment_id="<id>")。

预期的示例输出,如果存在子级

  {
    "_links": {
      "children": "/api/v1/category/1/children"

    }, 
    "id": 1, 
    "name": "some_name"
  }

预期的示例输出,如果不存在子级:

  {
    "_links": {
      "children": null 

    }, 
    "id": 1, 
    "name": "some_name"
  }

先感谢您

4

1 回答 1

1

我认为你过度设计你的设计。只是有:

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链接的值而不是空结果,IMO 让自己头疼。

否则,如果你真的想要/需要。post_dump 装饰器应该让您可以找到id值。

于 2021-03-23T22:29:15.777 回答