djangoのQuerySetでグルーピングしてカウントする

こんなテーブルがあるとする

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `prefecture` varchar(3) NOT NULL,
  `age` int NOT NULL,
   PRIMARY KEY (`id`)
);
id name prefecture age
1 田中たけし 千葉 18
2 岡田ひろ 千葉 31
3 須藤ゆうじ 佐賀 24
4 中山ひろ子 滋賀 29
5 鈴木一郎 滋賀 38
6 佐藤太郎 滋賀 55


よくある県ごとにグルーピングして集計するSQL

select prefecture, count(prefecture) from person group by prefecture;


sqlだとスラスラ出てくるけど、QuerySetだとちょっと考えてしまった。
以下の書き方でよさそう。

>>> from django.db.models import Count
>>> Person.objects.values('prefecture').annotate(Count('prefecture'))
SELECT `person`.`prefecture`,
       COUNT(`person`.`prefecture`) AS `prefecture__count`
FROM `person`
GROUP BY `person`.`prefecture`
ORDER BY NULL LIMIT 21

QuerySetのsqlの確認はdjango-extensionsのshell_plusで--print-sqlすると楽
django shellで実行されるsqlを表示する - brainstorm