0

抱歉,如果这听起来很愚蠢,但我正在尝试为作者获取所有书籍。这就是我所拥有的:

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 ......我怎么能这样做?

4

1 回答 1

0

编辑:

好的,显然我不理解关系的概念哈哈,我可以通过简单地向我的 Author 实体添加关系来避免所有这些麻烦:

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 来做到这一点......

想法?

于 2019-12-23T19:57:12.757 回答