[英]Filter by grandchildren count in SQLAlchemy
我在構造查詢時遇到困難,其中A
對象按C
計數進行過濾,其中C
是A
的孫子。 這是我當前的(簡化的)模型代碼:
class A(Base):
__tablename__ = 'as'
pk = Column(Integer, primary_key=True)
class B(Base):
__tablename__ = 'bs'
pk = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey('as.pk')
a = relationship('A', backref='bees')
class C(Base):
__tablename = 'cs'
pk = Column(Integer, primary_key=True)
child_id = Column(Integer, ForeignKey('bs.id'))
child = relationship('B', backref='cees')
我嘗試了以下查詢,但未成功:
DBSession.query(A).filter(func.count(A.bees.cees) == 5)
# Neither 'InstrumentedAttribute' object nor 'Comparator' object associated
# with A.bees has an attribute 'cees'
DBSession.query(A).having(B.cees == 5)
# missing FROM-clause entry for table "bs"
所有幫助,不勝感激。
借助subquery
:
sq = (session.query(A.pk.label('a_pk'), func.count(C.pk).label('num_cees'))
.outerjoin(B).outerjoin(C).group_by(A.pk)
.having(func.count(C.pk) == 5) # toggle-comment-line
).subquery('c_count')
q = (session.query(A)
.join(sq, A.pk == sq.c.a_pk)
# .filter(sq.c.num_cees == 5) # toggle-comment-line
)
您可以將過濾條件放在subquery
或主query
。 僅注意在A中過濾0
(無)Cs的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.