(Mise à jour: Plein ORM agrégation de prise en charge est désormais inclus dans Django 1.1. Fidèle à l'avertissement ci-dessous sur l'utilisation des Api privées, la méthode décrite ici ne travaille plus dans l'après-1.1 versions de Django. Je n'ai pas creusé pour comprendre pourquoi; si vous êtes sur la 1.1 ou ultérieure, vous devez utiliser le réel de l'agrégation de l'API de toute façon.)
L'agrégation principal soutien était déjà là en 1.0; il est juste de sans-papiers, non pris en charge, et n'a pas une amicale de l'API sur le dessus de celui-ci encore. Mais ici, c'est comment vous pouvez l'utiliser de toute façon jusqu'à 1.1 arrive (à vos risques et périls, et en pleine connaissance de la requête.group_by attribut n'est pas partie d'une API publique et le risque de changement):
query_set = Item.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']
Si vous parcourir query_set, chaque valeur retournée sera un dictionnaire avec une "catégorie" et un "comte".
Vous n'avez pas à l'ordre par le comte ici, c'est juste inclus pour montrer comment c'est fait (il doit être fait dans la .extra() appel, pas ailleurs dans le queryset de la construction de la chaîne). Aussi, vous pourriez tout aussi bien dire count(id) au lieu de compter(1), mais celle-ci peut être plus efficace.
Notez également que lors de la configuration .de la requête.group_by, les valeurs doivent être réels DB noms de colonne ('category_id') pas de Django les noms de champ ("catégorie"). C'est parce que vous êtes à peaufiner les requêtes internes à un niveau où tout est dans la bd, pas de Django termes.