Django 1.1 にはいくつかの新しい集約メソッドがあることを知っています。ただし、次のクエリに相当するものがわかりませんでした。
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Django 1.1 の Model Query API で可能ですか、それとも単純な SQL を使用する必要がありますか?
Django 1.1 にはいくつかの新しい集約メソッドがあることを知っています。ただし、次のクエリに相当するものがわかりませんでした。
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Django 1.1 の Model Query 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