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

Pie*_*aul 6 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)
Run Code Online (Sandbox Code Playgroud)

我想要检索Client至少1 Invoice和不到20的所有Invoice.我希望它能像这样工作:

Client.query.join(Invoice).filter(and_(Invoice.count() > 1, Invoice.count() <= 20))
Run Code Online (Sandbox Code Playgroud)

或者甚至这会很好:

Client.query.join(Invoice).filter(and_(count_(Invoice) > 1, count_(Invoice) <= 20))
Run Code Online (Sandbox Code Playgroud)

但当然,这不可能是这么简单..count()不能从那里工作很明显,我无法找到一个count_()sqlalchemy.func.

Pie*_*aul 11

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

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

我希望它对某人有所帮助!