Flask-SQLAlchemy-Marshmallow嵌套

时间:2017-06-13 01:39:15

标签: flask flask-sqlalchemy marshmallow

我尝试使用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'}}]

1 个答案:

答案 0 :(得分:3)

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

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

并且category应出现在fields的{​​{1}}类的Meta属性中,因此它实际上出现在序列化中。

应该是这样的:

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已经在处理模型的映射。