【发布时间】:2012-05-18 05:42:44
【问题描述】:
我有两个表/对象之间的多对多关系:标签和内容。 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()) 删除计数不正确的结果,但它会通过从结果集中完全删除行来做到这一点,这不是我想要的。
【问题讨论】:
标签: python sql many-to-many sqlalchemy