按关系中的项目计数过滤结果

时间:2016-07-28 13:28:26

标签: sqlalchemy

我们说我有这两种模式:

def Client(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    invoices = db.relationship('Invoice', backref='client')


def Invoice(db.Model):
    id = db.Column(db.Integer, primary_key=True)

我想检索至少1 Client且少于20 Invoice的所有Invoice。 我希望它能像这样工作:

Client.query.join(Invoice).filter(and_(Invoice.count() > 1, Invoice.count() <= 20))

甚至这样也不错:

Client.query.join(Invoice).filter(and_(count_(Invoice) > 1, count_(Invoice) <= 20))

但当然,它不能这么简单。 .count()显然无法在那里工作,我无法在count_()中找到sqlalchemy.func

1 个答案:

答案 0 :(得分:10)

感谢同事和代码,我们得到了它的工作:

    client = Client.query\
        .outerjoin(Client.invoices)\
        .group_by(Client)\
        .having(\
             func.and_(\
                 func.count_(Client.invoices) >= 1)\
                 func.count_(Client.invoices) <= 20)\
             )
        ).all()

我希望它有所帮助!