objects python sql django django-queryset django-aggregation

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 campo player_type en la cláusula GROUP BY .
  • order_by() : para la exclusión, es posible un orden predeterminado que puede ocasionar la inclusión de campos no necesarios en SELECT y GROUP BY .