Django ORMで集計処理(Count・Sum)を完全解説!初心者でもわかるデータの数え方と合計
生徒
「Djangoでデータベースの件数や合計を出したいんですが、どうやるんですか?」
先生
「DjangoではORMという仕組みを使って、データベースを直接操作しなくても集計処理ができます。」
生徒
「集計処理って、そもそも何ですか?」
先生
「データの数を数えたり、金額を合計したりすることです。では、基本から順番に見ていきましょう。」
1. Django ORMの集計処理とは?
Django ORMの集計処理とは、データベースに保存されている情報をまとめて計算する仕組みです。たとえば「登録ユーザーは何人いるか」「注文金額の合計はいくらか」といった処理を、Pythonのコードだけで書けます。
ORMとは「データベースを表のように直接触らなくても操作できる仕組み」のことです。難しく感じるかもしれませんが、普段使っている名簿や家計簿を数える感覚に近いです。
2. 集計で使うCountとSumの基本
Django ORMでよく使う集計機能がCountとSumです。Countは「件数を数える」、Sumは「数値を合計する」ためのものです。
スーパーで商品が何個あるか数えるのがCount、レジで合計金額を出すのがSumだと考えるとイメージしやすくなります。
3. Countでデータの件数を数える方法
まずはCountの使い方です。ここでは、ブログ記事モデルの記事数を数える例を見てみましょう。
from django.db.models import Count
from blog.models import Article
article_count = Article.objects.aggregate(Count('id'))
print(article_count)
{'id__count': 10}
この結果は「記事が10件ある」という意味です。aggregateは「全体をまとめて計算する」という役割を持っています。
4. 特定条件の件数をCountで取得する
条件をつけて件数を数えることもできます。たとえば「公開中の記事だけを数えたい」場合です。
from django.db.models import Count
from blog.models import Article
public_count = Article.objects.filter(is_public=True).count()
print(public_count)
7
これは「公開されている記事が7件ある」ことを表します。フィルターは、名簿から条件に合う人だけを抜き出す作業と同じです。
5. Sumで数値データを合計する方法
次にSumを使って合計を出してみます。ここでは、商品の価格を合計する例を考えます。
from django.db.models import Sum
from shop.models import Product
total_price = Product.objects.aggregate(Sum('price'))
print(total_price)
{'price__sum': 15000}
これは「全商品の価格を足した合計が15000」という意味です。電卓で全部足す代わりに、Djangoが自動で計算してくれます。
6. 条件付きでSumを使う場合
Sumも条件付きで使えます。たとえば「在庫がある商品の合計金額」を出したい場合です。
from django.db.models import Sum
from shop.models import Product
stock_sum = Product.objects.filter(stock__gt=0).aggregate(Sum('price'))
print(stock_sum)
{'price__sum': 9800}
stock__gt=0は「在庫が0より大きい」という意味です。難しい記号に見えますが、「条件指定」と覚えておけば大丈夫です。
7. CountとSumを使うときの注意点
集計結果は辞書形式で返ってきます。そのため、画面表示や計算に使うときは、キーを正しく指定する必要があります。
また、データが存在しない場合はNoneになることがあります。これは「結果が空」という意味なので、エラーではありません。
8. Django ORM集計処理の活用イメージ
Django ORMのCountとSumを使うことで、管理画面の統計表示や、売上確認、ユーザー数の把握などが簡単になります。
難しいSQLを書かなくても、Pythonのコードだけで安全にデータ集計ができる点が、Django ORMの大きな特徴です。初心者でも少しずつ慣れていけば、自然に使えるようになります。
まとめ
本記事では、Django ORMを使った集計処理について、CountとSumという基本かつ非常に重要な機能を中心に、初心者でも理解できるように段階的に解説してきました。Django ORMの集計処理は、データベースに保存されている大量のデータを効率よく整理し、件数を数えたり数値を合計したりするための仕組みです。SQLを直接書かなくても、Pythonのコードだけで安全かつ直感的に集計処理が行える点が大きな特徴です。
Countは「いくつあるか」を調べるための基本的な集計方法であり、ユーザー数、記事数、注文数など、Webアプリケーションでは非常によく使われます。Sumは「合計はいくらか」を求めるための集計方法で、金額、数量、ポイントなどの数値データを扱う場面で活躍します。これらは単体で使うだけでなく、filterと組み合わせることで「条件付き集計」が可能になり、実用的なデータ分析や管理画面の表示に直結します。
集計処理では、aggregateメソッドやcountメソッドを正しく使い分けることが重要です。aggregateは全体をまとめて計算し、結果を辞書形式で返します。一方でcountは件数のみをシンプルに整数で返すため、用途に応じて選ぶことでコードが読みやすくなります。また、集計結果がNoneになるケースも理解しておく必要があります。これはデータが存在しないことを示しているだけであり、エラーではありません。
Django ORMの集計処理を理解することは、データベース設計やモデル設計を考える上でも非常に役立ちます。どのカラムを数えるのか、どの数値を合計するのかを意識することで、より実践的で拡張しやすいアプリケーションを作れるようになります。初心者の方は、まずはCountとSumに慣れ、実際に小さなデータで試しながら理解を深めていくことが大切です。
集計処理のサンプルプログラム振り返り
ここで、記事内で学んだ集計処理をあらためて確認してみましょう。Django ORMでは、モデルクラスを通して直感的に集計処理を書けます。
from django.db.models import Count, Sum
from blog.models import Article
from shop.models import Product
# 記事の総件数を取得
article_count = Article.objects.aggregate(Count('id'))
# 公開中の記事件数を取得
public_count = Article.objects.filter(is_public=True).count()
# 商品価格の合計を取得
total_price = Product.objects.aggregate(Sum('price'))
# 在庫がある商品の価格合計を取得
stock_sum = Product.objects.filter(stock__gt=0).aggregate(Sum('price'))
{'id__count': 10}
7
{'price__sum': 15000}
{'price__sum': 9800}
このように、CountとSumを使うことで、件数確認や合計計算が非常に簡潔に書けます。実務では、管理画面のダッシュボード表示や、日別や月別の集計処理など、応用範囲は広がっていきます。
生徒
「CountとSumって、最初は難しそうだと思っていましたが、使い道がはっきりすると理解しやすいですね。」
先生
「そうですね。Django ORMの集計処理は、日常的な『数える』『足す』という感覚と同じなので、実例で考えると分かりやすいです。」
生徒
「filterと組み合わせることで、条件付きで集計できるのも便利だと思いました。」
先生
「その通りです。条件付き集計を覚えると、ユーザー数の把握や売上管理など、実際のWebアプリで必要な処理が一気に書けるようになります。」
生徒
「まずはCountとSumをしっかり使いこなして、少しずつ他の集計にも挑戦してみます。」
先生
「それが一番の近道です。Django ORMの集計処理に慣れてくると、データベース操作への不安も自然と減っていきますよ。」