1

Django のauth appで同じfirst_nameを持つユーザーの数を知りたいだけだと想像してください。SQLでこれを本当に簡単に行う方法を知っています:

SELECT first_name, COUNT(1) as num_users 
  FROM auth_user 
  GROUP BY first_name
  ORDER BY num_users DESC;

また、Django で必要な出力を取得する方法も知っています (たとえば、すべてのユーザーを調べて、電子メールを取得し、フィルターを実行してカウントするなど)。

Django の ORM を介してこれを行う簡単な方法はありませんか? 外部キーを使用して集計しているが、テーブル フィールドの 1 つを使用していない場合は、それを達成できます。私は何かが欠けていると確信しています。

ありがとう。

4

3 に答える 3

1

Django の注釈を使用すると、クエリセット (またはクエリセット全体の集計) 内の各オブジェクトにいくつかの基本的な計算を追加できますが、それらの注釈をフィルター処理することはできません (つまり、あなたの場合、あなたの名前を共有するユーザーのみをカウントしたい)

Django にはF() objects、クエリ内でフィールド値を使用できるものもあります。理想的には、これらを注釈と組み合わせて使用​​して、注釈を付けているオブジェクトをフィルタリングすることができますが、現在それは不可能です (途中で修正があります)。

したがって、簡単な解決策は、注釈を手動で実行することです。

users = User.objects.all().extra(select={
    'same_name_count' : """
    SELECT COUNT(*)
    FROM auth_user
    WHERE auth_user.first_name = user.first_name
    """
})
于 2012-12-03T23:17:27.010 に答える
1

私は数年前にこの問題についてブログを書きました。他の回答とは対照的に、Djangoでは生のSQLを必要とせずに完全に可能です。

于 2012-12-03T23:23:27.763 に答える
0

これを確認してください: https://docs.djangoproject.com/en/dev/topics/db/aggregation/

from django.db.models import Count
auth_user.objects.annotate(num_users=Count('first_name'))

より複雑なクエリの場合は、プレーン SQL を使用できますが、それは避けてください。

UPDコードが修正されました。言及してくれたティミー・オマホニーに感謝します!

于 2012-12-03T23:05:09.007 に答える