( Atualização : o suporte de agregação ORM completo agora está incluído no Django 1.1 . Fiel ao aviso abaixo sobre o uso de APIs privadas, o método documentado aqui não funciona mais nas versões pós-1.1 do Django. Eu não investiguei o porquê; se estiver no 1.1 ou posterior, você deve usar a API de agregação real de qualquer maneira.)
O suporte de agregação central já estava lá em 1.0; é apenas não documentado, sem suporte e ainda não tem uma API amigável além dele. Mas aqui está como você pode usá-lo mesmo assim até 1.1 chegar (por sua própria conta e risco, e com pleno conhecimento de que o atributo query.group_by não faz parte de uma API pública e pode mudar):
query_set = Item.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']
Se você iterar em query_set, cada valor retornado será um dicionário com uma chave de "categoria" e uma chave de "contagem".
Você não precisa ordenar por -count aqui, que está incluído apenas para demonstrar como é feito (tem que ser feito na chamada .extra (), não em outro lugar na cadeia de construção do queryset). Além disso, você também poderia dizer contagem (id) em vez de contagem (1), mas o último pode ser mais eficiente.
Note também que ao configurar .query.group_by, os valores devem ser nomes de colunas reais do banco de dados ('category_id') e não nomes de campos do Django ('category'). Isso ocorre porque você está ajustando a parte interna da consulta em um nível em que tudo está em termos de banco de dados, não em termos de Django.