首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQLAlchemyAutoSchema访问flask-marshmallow模式类中的模型属性

使用SQLAlchemyAutoSchema访问flask-marshmallow模式类中的模型属性
EN

Stack Overflow用户
提问于 2021-03-23 22:01:17
回答 1查看 96关注 0票数 0

我有一个简单的db模型,它引用自己来创建一个层次结构。现在我想使用Flask、Flask-SQLAlchemy和Flask- RESTapi构建一个棉花糖。为了方便起见,我从ma.SQLAlchemyAutoSchema继承了模式类(其中ma是flask-marshmallow的实例)

如果模型有子对象,我希望我的端点返回类别对象,包括一个指向返回子对象的端点的链接。(它工作得很好。)但如果模型没有子项,则不应包含该链接。

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

代码语言:javascript
复制
#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")
代码语言:javascript
复制
#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 )。

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

代码语言:javascript
复制
  {
    "_links": {
      "children": "/api/v1/category/1/children"

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

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

代码语言:javascript
复制
  {
    "_links": {
      "children": null 

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

提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-24 06:29:16

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

代码语言:javascript
复制
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值的权限。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66764699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档