Flask-SQLAlchemy-棉花糖嵌套

Flask-SQLAlchemy-Marshmallow Nesting

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

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

除此之外,Items 中的 category 不可迭代(它是 "one-to-many" 关系的 "one" 端),因此 many=True 参数抛出一个错误。

category应该出现在Metaclass的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)

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