【发布时间】:2019-01-16 00:36:21
【问题描述】:
我有一个项目,我正在尝试使用 marshmallow-sqlalchemy 包将数据从 JSON 加载到 Sqlalchemy 数据库中。该模型包含与子模型的一对多关系。
使用作者多书的经典例子:
class Book(Base):
__tablename__ = "book"
id = Column(Integer, primary_key=True)
title = Column(String(50))
author_id = Column(Integer, ForeignKey("author.id"), nullable=False)
author = relationship("Author", backref=backref("books"))
class Author(Base):
__tablename__ = "author"
id = Column(Integer, primary_key=True)
name = Column(String(250))
books = relationship("Author", back_populates="author")
class BookSchema(ModelSchema):
class Meta:
model = Book
sqla_session = Session
class AuthorSchema(ModelSchema):
class Meta:
model = Author
sqla_session = Session
books = fields.Nested(BookSchema, many=True)
输入的 JSON 是
{
"name": "Author A",
"books": [
{"title": "Book 1"},
{"title": "Book 2"}
]
}
当我尝试加载该 JSON 时,使用以下内容:
json_repr = {...}
author_schema = AuthorSchema()
obj_repr = author_schema.load(json_repr)
当它试图反序列化文档说 Book 是一种不可散列的类型时,它会引发异常。
发生了什么,我相信反序列化器正在尝试使用类似的东西来创建对象
obj = model(**data)
这不适用于一对多关系,因为列表的实例需要append()'ed 到 Author.books 属性。
我在网络上的任何地方都找不到任何这样的示例,我看到的每个示例似乎都嵌套了一个实例,而不是一个列表。是否有推荐的方法来使用 marshmallow-sqlalchemy 完成此操作,或者我应该恢复使用直接 marshmallow 包,并使用 @post_load 方法手动附加关系对象。
【问题讨论】:
标签: python sqlalchemy marshmallow