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 21QuerySetのsqlの確認はdjango-extensionsのshell_plusで--print-sqlすると楽
django shellで実行されるsqlを表示する - brainstorm