Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在炼金术中订购一对多型号?_Python_Flask_Flask Sqlalchemy - Fatal编程技术网

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