【问题标题】:How can I create a Schema in Marshmallow to reverse-nest queried data?如何在 Marshmallow 中创建模式以反向嵌套查询数据?
【发布时间】:2019-12-23 18:54:15
【问题描述】:

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

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……我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    编辑:

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

    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 来执行此操作...

    想法?

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2021-01-31
      • 2019-05-25
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多