カテゴリ: Django 更新日: 2026/04/07

Django ORMのannotate入門|集計値や計算列を作る方法を初心者向けにやさしく解説

Django ORMのannotate入門|集計値や計算列を作る方法
Django ORMのannotate入門|集計値や計算列を作る方法

先生と生徒の会話形式で理解しよう

生徒

「Djangoでデータの合計や数をまとめて表示することってできますか?」

先生

「できますよ。Django ORMのannotateを使うと、データベースの中で集計した結果を、そのまま一覧として取り出せます。」

生徒

「集計って、計算とか合計を出すってことですよね?」

先生

「そうです。電卓で足し算する代わりに、データベースに計算を任せるイメージですね。」

1. Django ORMのannotateとは?

1. Django ORMのannotateとは?
1. Django ORMのannotateとは?

Django ORMのannotateは、データを取得するときに「計算結果の列」を一緒に作るための機能です。難しく聞こえますが、簡単に言うと「一覧表に計算した結果の列を追加する」仕組みです。

例えば、買い物の明細表に「合計金額」という列を後から足すような感覚です。Pythonで一件ずつ計算しなくても、データベースが自動で計算してくれます。

2. 集計とannotateの関係

2. 集計とannotateの関係
2. 集計とannotateの関係

集計とは、数を数えたり、合計を出したり、平均を計算したりすることです。DjangoではCountSumなどを使って集計します。

annotateは、これらの集計結果を「各データごと」にくっつける役割を持っています。これにより、一覧画面で「この人は何件持っているか」といった情報を一度に表示できます。

3. Countを使ったannotateの基本例

3. Countを使ったannotateの基本例
3. Countを使ったannotateの基本例

まずは一番よく使うCountです。これは「数を数える」ための集計です。ブログ記事とコメントがある場合、記事ごとのコメント数を知りたいときに使います。


from django.db.models import Count
from blog.models import Post

posts = Post.objects.annotate(comment_count=Count('comment'))

このコードでは、comment_countという新しい列を作り、コメントの数を入れています。データベース上で計算されるため、とても高速です。

4. Sumを使って合計を計算する

4. Sumを使って合計を計算する
4. Sumを使って合計を計算する

Sumは、数値を合計するための集計です。例えば、注文と金額がある場合、ユーザーごとの合計金額を出せます。


from django.db.models import Sum
from shop.models import Customer

customers = Customer.objects.annotate(total_price=Sum('order__price'))

ここでは、関連する注文の金額をすべて足して、total_priceという列にしています。家計簿で月の合計を出す感覚に近いです。

5. 計算式を使ったannotate

5. 計算式を使ったannotate
5. 計算式を使ったannotate

annotateは、単純な集計だけでなく、計算式も使えます。たとえば「単価 × 数量」のような計算です。


from django.db.models import F, ExpressionWrapper, IntegerField
from shop.models import Item

items = Item.objects.annotate(
    total=ExpressionWrapper(
        F('price') * F('quantity'),
        output_field=IntegerField()
    )
)

Fは「同じ行の別の列」を指すための仕組みです。表の中で横にある数字同士を掛け算するイメージです。

6. annotateとvaluesを組み合わせる

6. annotateとvaluesを組み合わせる
6. annotateとvaluesを組み合わせる

valuesと一緒に使うと、「項目ごとにまとめた集計」ができます。これはグループ分けした集計と考えるとわかりやすいです。


from django.db.models import Count
from blog.models import Post

data = Post.objects.values('category').annotate(post_count=Count('id'))

カテゴリごとに記事数を数えています。表計算ソフトで「カテゴリ別に件数を出す」操作と同じです。

7. annotateを使うときの注意点

7. annotateを使うときの注意点
7. annotateを使うときの注意点

annotateはとても便利ですが、計算結果が増える分、SQLが複雑になります。そのため、必要な集計だけを行うことが大切です。

また、結果は通常のフィールドと同じように扱えますが、データベースに保存されるわけではありません。「その場で計算された値」だと理解しておくと混乱しません。

まとめ

まとめ
まとめ

今回は、Django ORMのannotateについて、初心者の方でも理解しやすいように、基本的な考え方から具体的な使い方までを順番に振り返りました。annotateは、データベースからデータを取得すると同時に、集計結果や計算結果を新しい列として追加できる非常に便利な機能です。Pythonで一件ずつ処理するのではなく、データベース側でまとめて計算してくれるため、処理速度が速く、コードも読みやすくなります。

Countを使えば件数を数えることができ、ブログ記事ごとのコメント数や、ユーザーごとの投稿数などを簡単に取得できます。Sumを使えば金額や数量の合計を計算でき、注文履歴や売上管理など、実務でもよく使う集計処理をシンプルに書けます。さらに、FやExpressionWrapperを使うことで、同じ行にある値同士を使った計算も可能になり、単価と数量から合計金額を求めるといった処理も自然に表現できます。

annotateはvaluesと組み合わせることで、カテゴリ別や日付別など、グループごとの集計にも対応できます。これは表計算ソフトでの集計表をイメージすると理解しやすく、データをどの単位でまとめたいのかを意識することが大切です。一方で、annotateを多用しすぎるとSQLが複雑になり、意図しない結果になることもあります。そのため、必要な集計だけを行い、結果は一時的な計算値であり、データベースに保存されるわけではない点をしっかり理解しておくことが重要です。

Django ORMのannotateを正しく使いこなせるようになると、一覧画面や管理画面での表示が一気に便利になり、実践的なWebアプリケーション開発に大きく役立ちます。集計処理に苦手意識を持っていた方も、今回の内容を繰り返し確認しながら、自分の手でコードを書いて試してみることで、自然と理解が深まっていくはずです。

まとめで確認するサンプルプログラム

ここでは、記事全体の内容を振り返るために、annotateを使った代表的なサンプルコードをもう一度確認します。コメント数を集計する基本的な例です。


from django.db.models import Count
from blog.models import Post

posts = Post.objects.annotate(comment_count=Count('comment'))

for post in posts:
    print(post.title, post.comment_count)

このように、annotateで追加した集計結果は、通常のフィールドと同じように扱えます。テンプレートやビューでそのまま参照できるため、一覧表示やランキング表示などにも応用できます。

先生と生徒の振り返り会話

生徒

「annotateって難しそうだと思っていましたが、一覧に計算した列を追加するだけだと考えると、少し身近に感じました。」

先生

「その感覚で大丈夫ですよ。データベースに計算を任せる仕組みだと理解できれば、無理に難しく考える必要はありません。」

生徒

「CountやSumを使えば、コメント数や合計金額も簡単に出せるのが便利ですね。」

先生

「はい。実務では集計処理がとても多いので、annotateを覚えておくと開発がかなり楽になります。」

生徒

「計算結果は保存されない、一時的な値だという点も大事だと分かりました。」

先生

「その理解はとても重要です。まずは基本的な使い方をしっかり身につけて、少しずつ応用していきましょう。」

カテゴリの一覧へ
新着記事
New1
Django
Djangoマイグレーションの基本コマンド完全解説|makemigrationsとmigrateでDB設計を理解しよう
New2
Django
Django ORMのannotate入門|集計値や計算列を作る方法を初心者向けにやさしく解説
New3
Flask
FlaskでJSONレスポンスを多言語化!API設計の基本を初心者向けに解説
New4
Django
Djangoマイグレーション入門|モデル変更をDBへ適用する仕組みを初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでCassandraに接続する方法を完全ガイド!cassandra-driverの使い方
No.2
Java&Spring記事人気No2
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
No.3
Java&Spring記事人気No3
Python
Pythonの変数宣言と型ヒントの使い方!初心者向けに基礎をやさしく解説
No.4
Java&Spring記事人気No4
Flask
PythonのFlaskで言語を自動判別!ユーザーに合わせた表示切り替えの仕組みを徹底解説
No.5
Java&Spring記事人気No5
Python
Pythonの関数を使ったカスタムソート(keyパラメータ)をわかりやすく解説!初心者でも使える並べ替えテクニック
No.6
Java&Spring記事人気No6
Flask
PythonのFlaskでテンプレートを多言語化!翻訳の基本構文を完全ガイド
No.7
Java&Spring記事人気No7
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策
No.8
Java&Spring記事人気No8
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例