djangoの集計機能を使用して、複数の制約を持つレコードをカウントするにはどうすればよいですか?
django トランクを使用して、複雑なデータベース固有の SQL ステートメントを django 集計に置き換えようとしています。例として、多くのドメイン (.co.uk、.com、.etc など) で実行されているブログ用のテーブルで構成されたデータベースがあり、それぞれに多くのコメントがあるとします。
domains <- blog -> comment
次の SQL は、ドメインごとにコメントをカウントします。
SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id
GROUP BY D.id
これは、次の方法で簡単に複製できます。
Domain.objects.annotate(Count('blogs__comments'))
これをさらに一歩進めて、1 つ以上の制約を追加し、次の SQL を複製できるようにしたいと考えています。
SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id
AND C.active = True
GROUP BY D.id
これは、django が WHERE 句を使用して shaboodle 全体をフィルタリングすることを含むように見えるため、複製するのがはるかに困難です。
Domain.objects.filter(blogs__comments__active=True)
.annotate(Count('blogs__comments'))
SQL は次のようになります。
SELECT ..., COUNT(comment.id) AS blog__comments__count FROM domain
LEFT OUTER JOIN blog ON domain.blog_id = blog.id
LEFT OUTER JOIN comment ON blog.id = comment.blog_id
WHERE comment.active = True
GROUP BY domain.id
ORDER BY NULL
djangoに適切な追加の制約をポップするように説得するにはどうすればよいLEFT OUTER JOIN
ですか? コメントのないブログの数を含めたいので、これは重要です。