因为您希望在子论坛对象上可以访问post计数,所以在设置映射程序时需要将其声明为column属性。列属性声明应该如下所示(假设使用声明式):
Forum.post_count = column_property(select([func.count()],
Message.__table__.c.forum == Forum.__table__.c.id
).correlate(Forum.__table__).as_scalar().label('post_count'),
deferred=True)
然后您可以这样表达查询:
query(Forum).filter_by(parent=None).options(
eagerload('children'),
undefer('children.post_count'))
另一个选择是选择子项并分别计数。在这种情况下,您需要自己对结果进行分组:
ChildForum = aliased(Forum)
q = (query(Forum, ChildForum, func.count(Message.id))
.filter(Forum.parent == None)
.outerjoin((ChildForum, Forum.children))
.outerjoin(ChildForum.posts)
.group_by(Forum, ChildForum)
)
from itertools import groupby
from operator import attrgetter
for forum, childforums in groupby(q, key=attrgetter('Node')):
for _, child, post_count in childforums:
if child is None:
# No children
break
# do something with child