我正在尝试编写一个特定的查询,以允许用户优化其搜索。我与作者和书籍之间存在一对多的关系:

class Author(Model):
    id = Column(Integer, primary_key=True)
    name = Column(String)
    books = relationship('Book', backref='author', lazy='dynamic')

class Book(Model):
    id = Column(Integer, primary_key=True)
    title = Column(String)
    pages = Column(Integer, default=0)
    is_published = Column(Boolean, default=False)
    author_id = Column(Integer, ForeignKey('author.id'))


如何在Flask sqlalchemy中构建适当的查询来回答此问题:

“给我所有至少有一本已出版的书的作者,并按照书中从最短到最长的页数对所有作者进行排序。”

我认为作者只会按照最短的书来排序,而不管他们是否有一本更长的书。

一个例子:

Bob
   book A: 62 pages, published
   book B: 10 pages, published

Alice
   book C: 100 pages, published
   book D: 1 pages, published

Carol
   book E: 3 pages, NOT-published
   book F: 1000 pages, published

Eve
   book G: 2000 pages, NOT-published


该查询将按以下顺序返回作者:

  [ Alice, Bob, Carol ]


由于爱丽丝的出版时间最短(1页),鲍勃的出版时间第二短(10页),而卡罗尔的出版时间最长(1000页)。夏娃没有被提及是因为她没有任何出版的书籍。

最佳答案

尝试以下方法:

session.query(Author)
    .join(Author.books)
    .filter(Book.is_published == True)
    .group_by(Author.id)
    .order_by(func.min(Book.pages))

关于python - 在Flask sqlalchemy中订购一对多模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32300804/

10-10 11:00