Python 在炼金术中订购一对多型号?
我正在尝试编写一个特定的查询,允许用户优化他们的搜索。我在作者和书籍之间有一对多的关系:Python 在炼金术中订购一对多型号?,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在尝试编写一个特定的查询,允许用户优化他们的搜索。我在作者和书籍之间有一对多的关系: 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, pri
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'))
如何在Alchemy中构建适当的查询来回答此问题:
“给我所有至少出版过一本书的作者,并按他们书中的页数从最短到最长对所有作者进行排序。”
我认为,无论他们是否有另一本更长的书,作者将只按他们最短的书进行排序
例如:
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页)。Eve没有被提及,因为她没有出版过任何书籍。请尝试以下方法:
session.query(Author)
.join(Author.books)
.filter(Book.is_published == True)
.group_by(Author.id)
.order_by(func.min(Book.pages))
相反的情况是什么(从最高到最低)?我尝试了
func.max()
,但由于某些原因,它仍然返回最小值。如果您想按顺序翻转,可以使用desc(func.min(Book.pages))