Django 1.1にはいくつかの新しい集計方法があることは知っていますが、次のクエリに相当するものを見つけることができませんでした。
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Django 1.1のモデルクエリAPIで可能ですか、それともプレーンSQLを使用する必要がありますか?
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
_に不要なフィールドが含まれる可能性のあるデフォルトの順序を除外します。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
_