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