( Actualización : el soporte completo de agregación de ORM ahora está incluido en Django 1.1 . Fiel a la siguiente advertencia sobre el uso de API privadas, el método documentado aquí ya no funciona en versiones posteriores a la 1.1 de Django. No he investigado para averiguar por qué; si está en 1.1 o posterior, debe usar la API de agregación real de todos modos).
El soporte de agregación central ya estaba allí en 1.0; simplemente no está documentado, no es compatible y aún no tiene una API amigable. Pero así es como puede usarlo de todos modos hasta que llegue 1.1 (bajo su propio riesgo y con pleno conocimiento de que el atributo query.group_by no es parte de una API pública y podría cambiar):
query_set = Item.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']
Si luego itera sobre query_set, cada valor devuelto será un diccionario con una clave de "categoría" y una clave de "recuento".
No tiene que ordenar por recuento aquí, eso solo se incluye para demostrar cómo se hace (debe hacerse en la llamada .extra (), no en otra parte de la cadena de construcción del conjunto de consultas). Además, también podría decir count (id) en lugar de count (1), pero este último puede ser más eficiente.
Tenga en cuenta también que al configurar .query.group_by, los valores deben ser nombres de columna de base de datos reales ('category_id') y no nombres de campo de Django ('categoría'). Esto se debe a que está modificando los aspectos internos de la consulta a un nivel en el que todo está en términos de DB, no en términos de Django.