如何在棉花糖中创建架构以反向嵌套查询的数据?

时间:2019-12-23 18:54:15

标签: flask-sqlalchemy marshmallow flask-marshmallow marshmallow-sqlalchemy

抱歉,这听起来很愚蠢,但我正在尝试为作家准备所有书籍。这就是我所拥有的:

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()

这给了我一个(作者,书)元组,我无法将其映射到一个简洁的json ...我该怎么做?

1 个答案:

答案 0 :(得分:0)

我使用的解决方案是:

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 +棉花糖...

想法?