我有两个表/对象之间的多对多关系:标签和内容。Tag.content
是从标签到具有该标签的所有内容的关系。
现在我想找出分配给标签的内容对象的数量(对于所有标签,否则我会简单地使用len()
)。以下代码几乎可以工作:
cnt = db.func.count()
q = db.session.query(Tag, cnt) \
.outerjoin(Tag.content) \
.group_by(Tag) \
.order_by(cnt.desc())
但是,由于明显的原因,它永远不会返回零计数 - 毕竟由于LEFT JOIN
使用,每个标签至少有一行。这是一个问题,因为我想获得所有标签的正确计数 - 即0
如果标签是孤立的。
所以我想知道是否有办法实现这一点 - 显然不需要向数据库发送n+1查询。纯 SQL 解决方案也可能没问题,通常以某种方式将这样的解决方案映射到 SA 并不难。
.filter(Tag.content.any())
删除计数不正确的结果,但它会通过从结果集中完全删除行来做到这一点,这不是我想要的。