Ответ 1
Поскольку вы хотите, чтобы почтовый счет был доступен на дочерних объектах форума, вам нужно объявить его как свойство столбца при настройке картографов. Объявление свойства столбца должно выглядеть примерно так (если вы используете декларативный):
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