0

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ですか? コメントのないブログの数を含めたいので、これは重要です。

4

1 に答える 1

0

Djangoクエリ言語を使用してこれを行う方法はわかりませんが、生のSQLクエリをいつでも実行できます。その方法がまだわからない場合は、次の例をご覧ください。

from django.db import connection

def some_method(request, some_parameter):
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM table WHERE somevar=%s', [some_parameter])
    rows = cursor.fetchall()

詳細については、オンラインのDjangoブックを参照してください:http ://www.djangobook.com/en/2.0/chapter05/

「ビューでデータベースクエリを実行する「ばかげた」方法」のセクションを探してください。「ばかげた」方法を使いたくないのなら、私はあなたの選択肢が何であるかわかりません。

于 2009-07-18T14:30:01.857 に答える