web-dev-qa-db-ja.com

Django COUNTとGROUPBYに相当

Django 1.1にはいくつかの新しい集計方法があることは知っていますが、次のクエリに相当するものを見つけることができませんでした。

SELECT player_type, COUNT(*) FROM players GROUP BY player_type;

Django 1.1のモデルクエリAPIで可能ですか、それともプレーンSQLを使用する必要がありますか?

31
Imran

Django 1.1ベータ(トランク)を使用している場合:

_Player.objects.values('player_type').order_by().annotate(Count('player_type'))
_
  • values('player_type')-_player_type_フィールドのみを_GROUP BY_句に含める場合。
  • order_by()-SELECTおよび_GROUP BY_に不要なフィールドが含まれる可能性のあるデフォルトの順序を除外します。
61
Alex Koshelev

Django 1.1は、countなどの集計方法をサポートしています。あなたは見つけることができます 完全なドキュメントはここにあります

あなたの質問に答えるために、あなたは次の線に沿って何かを使うことができます:

_from Django.db.models import Count
q = Player.objects.annotate(Count('games'))
print q[0]
print q[0].games__count
_

実際のモデルに応じて、これを少し調整する必要があります。

編集:上記のスニペットは、オブジェクトごとに集計を生成します。モデルの特定のフィールドで集計が必要な場合は、valuesメソッドを使用できます。

_from Django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('games')).order_by()
print q[0]
print q[0].games__count
_

order_by()に明示的に渡されなくても、デフォルトの順序になっているフィールドが自動的に選択されるため、values()が必要です。このorder_by()の呼び出しは、すべての順序をクリアし、クエリを期待どおりに動作させます。

また、グループ化に使用されるフィールド(COUNT(*)と同等)をカウントする場合は、次を使用できます。

_from Django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('playertype')).order_by()
print q[0]
print q[0].playertype__count
_
15
Ayman Hourieh