python - objects - Django equivalente a COUNT con GROUP BY
group by django (2)
Django 1.1 soporta métodos de agregación como el conteo. Puedes encontrar la documentación completa aquí .
Para responder a su pregunta, puede usar algo como:
from django.db.models import Count
q = Player.objects.annotate(Count(''games''))
print q[0]
print q[0].games__count
Esto necesitará pequeños ajustes dependiendo de su modelo real.
Edición: el fragmento de código anterior genera agregaciones por objeto. Si desea la agregación en un campo particular en el modelo, puede usar el método de 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
Se necesita order_by()
porque los campos que están en el orden predeterminado se seleccionan automáticamente incluso si no se pasan explícitamente a los values()
. Esta llamada a order_by()
borra cualquier orden y hace que la consulta se comporte como se espera.
Además, si desea contar el campo que se usa para agrupar (equivalente a COUNT(*)
), puede usar:
from django.db.models import Count
q = Player.objects.values(''playertype'').annotate(Count(''playertype'')).order_by()
print q[0]
print q[0].playertype__count
Sé que Django 1.1 tiene algunos nuevos métodos de agregación. Sin embargo, no pude averiguar el equivalente de la siguiente consulta:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
¿Es posible con la API de consulta de modelo de Django 1.1 o debo usar SQL sin formato?
Si está utilizando Django 1.1 beta (troncal):
Player.objects.values(''player_type'').order_by().annotate(Count(''player_type''))
-
values(''player_type'')
: para incluir solo el campoplayer_type
en la cláusulaGROUP BY
. -
order_by()
: para la exclusión, es posible un orden predeterminado que puede ocasionar la inclusión de campos no necesarios enSELECT
yGROUP BY
.