( Update : Die vollständige Unterstützung der ORM-Aggregation ist jetzt in Django 1.1 enthalten . Gemäß der folgenden Warnung zur Verwendung privater APIs funktioniert die hier dokumentierte Methode in Post-1.1-Versionen von Django nicht mehr. Ich habe nicht nachgeforscht, um herauszufinden, warum; Wenn Sie 1.1 oder höher verwenden, sollten Sie trotzdem die echte Aggregations-API verwenden .)
Die Unterstützung für die Kernaggregation war bereits in Version 1.0 vorhanden. Es ist nur undokumentiert, nicht unterstützt und verfügt noch nicht über eine benutzerfreundliche API. Aber so können Sie es trotzdem verwenden, bis 1.1 eintrifft (auf eigenes Risiko und in vollem Wissen, dass das Attribut query.group_by nicht Teil einer öffentlichen API ist und sich ändern könnte):
query_set = Item.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']
Wenn Sie dann über query_set iterieren, ist jeder zurückgegebene Wert ein Wörterbuch mit einem "Kategorie" -Schlüssel und einem "Zähl" -Schlüssel.
Sie müssen hier nicht nach Anzahl bestellen, dies ist nur enthalten, um zu demonstrieren, wie es gemacht wird (es muss im Aufruf von .extra () gemacht werden, nicht anderswo in der Queryset-Konstruktionskette). Sie können auch genauso gut count (id) anstelle von count (1) sagen, aber letzteres ist möglicherweise effizienter.
Beachten Sie auch, dass beim Festlegen von .query.group_by die Werte tatsächliche DB-Spaltennamen ('category_id') und keine Django-Feldnamen ('category') sein müssen. Dies liegt daran, dass Sie die internen Abfragen auf einer Ebene optimieren, auf der alles in DB-Begriffen und nicht in Django-Begriffen angegeben ist.