如何在 Marshmallow 中创建架构以反向嵌套查询数据?
How can I create a Schema in Marshmallow to reverse-nest queried data?
抱歉,如果这听起来很傻,但我正在尝试为一位作者获取所有书籍。这是我的:
class Author(db.Model):
__tablename__='author'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class Book(db.Model):
__tablename__='book'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
author_id = db.Column(db.Integer, ForeignKey('author.id'))
author_rel = relationship('Author', lazy='joined'), backref='book')
我有我的模式:
class BookSchema(Schema):
id = fields.Int()
name= field.Str()
class BookSchema(Schema):
id = fields.Int()
title = field.Str()
author = fields.Nested(Author)
这样我就可以检索到有作者和作者的书了。
我在这里需要的是添加一个嵌套字段,其中包含每个作者的所有书籍......我一直在尝试,但没有这样做。有自动获取的方法吗?
我正在尝试在查询中连接表,但还是失败了:
session.query(Author, Book).join(Book, Author.id == Book.author_id).all()
这给了我一个 (Author, Book) 元组,我无法将其映射成简明的 json...我该怎么做?
编辑:
好吧,显然我不明白关系的概念哈哈我可以通过简单地向我的作者实体添加关系来避免所有这些麻烦:
class Author(db.Model):
__tablename__='author'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
books = relationship('Book', lazy='joined', backref='author_book')
class Book(db.Model):
__tablename__='book'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
author_id = db.Column(db.Integer, ForeignKey('author.id'))
author = relationship('Author', lazy='joined', backref='book_author')
然后我就可以正常填充我的棉花糖架构并开心了
============================================= =====
我使用的解决方案是:
session = Session()
author_objects = session.query(Author).all()
schema = AuthorSchema(many=True)
author_list = schema.dump(author_objects).data
book_objects = session.query(Book).all()
schema = BookSchema(many=True)
book_list = schema.dump(book_objects).data
for index, author in enumerate(author_list):
author_list[index]['books'] = [book for book in book_list if book['author_id'] == author['id']]
session.close()
return jsonify(author_list)
这对我来说有点像手册,我认为应该有更好的方法来使用模式自动执行此操作。毕竟,它基于存在的关系。
这行得通,但对于长列表来说会很慢......我更喜欢直接使用 sql-alchemy + marshmallow 来做到这一点......
想法?
抱歉,如果这听起来很傻,但我正在尝试为一位作者获取所有书籍。这是我的:
class Author(db.Model):
__tablename__='author'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class Book(db.Model):
__tablename__='book'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
author_id = db.Column(db.Integer, ForeignKey('author.id'))
author_rel = relationship('Author', lazy='joined'), backref='book')
我有我的模式:
class BookSchema(Schema):
id = fields.Int()
name= field.Str()
class BookSchema(Schema):
id = fields.Int()
title = field.Str()
author = fields.Nested(Author)
这样我就可以检索到有作者和作者的书了。 我在这里需要的是添加一个嵌套字段,其中包含每个作者的所有书籍......我一直在尝试,但没有这样做。有自动获取的方法吗?
我正在尝试在查询中连接表,但还是失败了:
session.query(Author, Book).join(Book, Author.id == Book.author_id).all()
这给了我一个 (Author, Book) 元组,我无法将其映射成简明的 json...我该怎么做?
编辑:
好吧,显然我不明白关系的概念哈哈我可以通过简单地向我的作者实体添加关系来避免所有这些麻烦:
class Author(db.Model):
__tablename__='author'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
books = relationship('Book', lazy='joined', backref='author_book')
class Book(db.Model):
__tablename__='book'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
author_id = db.Column(db.Integer, ForeignKey('author.id'))
author = relationship('Author', lazy='joined', backref='book_author')
然后我就可以正常填充我的棉花糖架构并开心了
============================================= =====
我使用的解决方案是:
session = Session()
author_objects = session.query(Author).all()
schema = AuthorSchema(many=True)
author_list = schema.dump(author_objects).data
book_objects = session.query(Book).all()
schema = BookSchema(many=True)
book_list = schema.dump(book_objects).data
for index, author in enumerate(author_list):
author_list[index]['books'] = [book for book in book_list if book['author_id'] == author['id']]
session.close()
return jsonify(author_list)
这对我来说有点像手册,我认为应该有更好的方法来使用模式自动执行此操作。毕竟,它基于存在的关系。
这行得通,但对于长列表来说会很慢......我更喜欢直接使用 sql-alchemy + marshmallow 来做到这一点......
想法?