Flask-SQLAlchemy:按关系对象的计数过滤

Flask-SQLAlchemy: filter by count of relationship objects

我的具有一对多关系的模型:

class Entry(db.Model):
    __tablename__ = "entries"
    ...
    quantities = db.relationship("Quantity", back_populates="entry", lazy="dynamic")

class Quantity(db.Model):
    __tablename__ = "quantities"
    ...
    entry_id = db.Column(db.ForeignKey("entries.id"), nullable=True)
    entry = db.relationship("Entry", back_populates="quantities")

我有一个这样的查询,可以很好地查找关系对象集合不为空的记录:

# Get entries with not empty quantities
entries = Entry.query.filter(
    Entry.quantities.any()
).all()

我还看到我也可以查询它们的字段值:

# Get entries with specific quantities
entries_with_specific_quantities = Entry.query.filter(
    Entry.quantities.any(),
    Entry.quantities.any(Quantity.some_field == "needed_value"),
    ~Entry.quantities.any(Quantity.some_field == "not_needed_value"),
).all()

但我不知道如何查询关系对象的数量。我试过类似的东西:

# Get entries with specific amount quantities
from sqlalchemy.sql.expression import func

entries_with_specific_amount_of_quantities = Entry.query.filter(
    func.count(Entry.quantities) == 2 # Or any int
).all()

哪个returnsProgrammingError: (pymysql.err.ProgrammingError) (1111, 'Invalid use of group function')

如何对条目进行分组并仅获取具有确切数量的关系对象的记录?

我认为 any 与 count 不兼容,因为它是一个聚合函数。

这是一个使用 HAVING 的简短解决方案。

def entries_with_specific_amount_of_quantities(session, only_count):
    return session.query(
        Entry,
    ).outerjoin(
        Entry.quantities
    ).group_by(
        Entry.id
    ).having(
        func.count(Quantity.id) == only_count)