【问题标题】:Flask-SQLAlchemy-Marshmallow NestingFlask-SQLAlchemy-Marshmallow 嵌套
【发布时间】:2017-06-13 01:39:14
【问题描述】:

我正在尝试使用 Flask 中的 Marshmallow 序列化一对多关系模型中的数据。我阅读了 Marshmallow 和 SQLAlchemy 文档,但无法正常工作。谁能帮帮我。

型号:

class Category(db.Model):
    __tablename__ = 'category_mn'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(45))
    status = db.Column(db.Integer, server_default=db.FetchedValue())
    items = db.relationship('Items', backref='category', lazy='dynamic')
    timestamp = db.Column(db.DateTime, server_default=db.FetchedValue())


class Items(db.Model):
    __tablename__ = 'items_mn'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100))
    category_id = db.Column(db.Integer, db.ForeignKey('category_mn.id'))
    timestamp = db.Column(db.DateTime, server_default=db.FetchedValue())

架构:

class CatSchema(ma.ModelSchema):
    class Meta:
        model = Category
        fields = ('id', 'name', 'status')


class ItemSchema(ma.ModelSchema):

    class Meta:
        model = Items
        fields = ('id', 'name')
    category = ma.Nested(CatSchema, many=True)

我正在寻找这样的输出:

[{'id':1, 'name':'Test', 'category':{'id':1, 'name':'Test Cat'}}]

【问题讨论】:

    标签: flask flask-sqlalchemy marshmallow


    【解决方案1】:

    您正在引用架构中不存在的模型。

    除此之外,Items 中的category 是不可迭代的(它是“一对多”关系的“一”侧),因此many=True 参数会引发错误。

    category 应该出现在Meta 类的fields 属性中ItemSchema,所以它实际上出现在序列化中。

    应该是这样的:

    class CatSchema(ma.ModelSchema):
      class Meta:
        model = Category
        fields = ('id', 'name', 'status')
    
    
    class ItemSchema(ma.ModelSchema):
    
      class Meta:
        model = Items
        fields = ('id', 'name', 'category')
      category = ma.Nested(CatSchema)
    

    当然,您可以根本不将fields 属性包含在元类中,因为model 已经负责映射模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2021-04-19
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多