( Mutakhirkan : Dukungan agregasi ORM penuh sekarang disertakan dalam Django 1.1 . Sesuai dengan peringatan di bawah ini tentang penggunaan API privat, metode yang didokumentasikan di sini tidak lagi bekerja dalam versi pasca-1.1 dari Django. Saya belum menggali untuk mencari tahu mengapa; jika Anda menggunakan 1.1 atau lebih baru, Anda harus tetap menggunakan API agregasi nyata .)
Dukungan agregasi inti sudah ada di 1.0; itu hanya tidak berdokumen, tidak didukung, dan belum memiliki API ramah di atasnya. Namun, inilah cara Anda tetap menggunakannya hingga versi 1.1 tersedia (dengan risiko Anda sendiri, dan dengan pengetahuan penuh bahwa atribut query.group_by bukan bagian dari API publik dan dapat berubah):
query_set = Item.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']
Jika Anda kemudian mengulangi query_set, setiap nilai yang dikembalikan akan menjadi kamus dengan kunci "kategori" dan kunci "hitungan".
Anda tidak perlu memesan berdasarkan -hitung di sini, itu hanya disertakan untuk mendemonstrasikan cara melakukannya (harus dilakukan dalam panggilan .extra (), bukan di tempat lain dalam rantai konstruksi queryset). Juga, Anda bisa saja mengatakan count (id) daripada count (1), tetapi yang terakhir mungkin lebih efisien.
Perhatikan juga bahwa ketika menyetel .query.group_by, nilainya harus nama kolom DB sebenarnya ('category_id') bukan nama bidang Django ('category'). Ini karena Anda mengutak-atik kueri internal pada tingkat di mana semuanya ada dalam istilah DB, bukan istilah Django.