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)
我的具有一对多关系的模型:
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)