<p>试试这个:</p>
<pre><code>query = db.session.query(Tag, db.count(Post.id))
query = query.filter(
(tags_to_posts_association_table.tag_id == Tag.id) & \
(tags_to_posts_association_table.post_id == Post.id)
)
query = query.group_by(Tag.id)
</code></pre>
<p>这将生成以下查询:</p>
^{pr2}$
<p>更干净的方法可以是这样的:</p>
<pre><code>query = db.session.query(Tag, db.func.count(Post.id))
# This works but the preferred way is what's below it
#query = query.join(tags_to_posts_association_table, Post)
query = query.join(Post.tags)
query = query.group_by(Tag.id)
</code></pre>
<p>这将生成以下查询:</p>
<pre><code>SELECT tags.id AS tags_id, tags.title AS tags_title, count(posts.id) AS count_1
FROM tags INNER JOIN tags_to_posts ON tags.id = tags_to_posts.tag_id INNER JOIN posts ON posts.id = tags_to_posts.post_id GROUP BY tags.id
</code></pre>
<p>所有这些都会产生相同的结果,您可以像这样将它们连锁起来:</p>
<pre><code>query = db.session.query(Tag.title, db.func.count(Post.id)).join(Post.tags).group_by(Tag.id)
# This will give you a dictionary with keys the tag titles, and values the count of each
# Because you can iterate over the query, which will give you the results
# Or you can use query.all() and use it as you prefer.
results = dict(query)
</code></pre>
<p>另外,我不确定它是<code>db.func.count</code>还是{<cd2>}。无论如何,您可以始终<code>from sqlalchemy import func</code>并使用<code>func.count</code>。在</p>