Djangoで簡単なデータの集計をしたいことがあるかと思います。
その時に使えるのがaggregateメソッドです。
ここでは、aggregateメソッドの使い方についてわかりやすく解説していきます。
集計(aggregate)でできること
まずは、集計(aggregate)でできることを簡単にご紹介します。
集計を使うと、データの平均値・最大値・最小値・データの数などを求めることができるようになります。
pythonの関数を使って計算することもできるのですが、djangoに備わっているコードを使った方が、簡単に集計をすることができます。
補足ちなみに、aggregateというのは「集計する」という意味です。そのままなので分かりやすいですね。
前提となるデータ
aggregateのイメージをかためるためには、具体的なデータと照らし合わせながら整理していった方が分かりやすいですので、使うデータをみていきましょう。
本の名前 | 値段 | 作者 |
秘密 | 788 | 東野圭吾 |
手紙 | 745 | 東野圭吾 |
竜馬がゆく | 756 | 司馬遼太郎 |
告白 | 669 | 湊かなえ |
今回は、このデータを使っていきます。
models.pyのコードもみていきましょう。
コードmodels.py
class Book(models.Model):
title = Models.CharField(max_length=100)
price = Models.IntegerField()
Author = Models.CharField(max_length=20)
aggregateの使い方
ここから、aggregateの使い方についてみていきましょう。
aggregateを使うには、「モデルの名前.objects.all().aggregate()」という形を使います。
モデルの名前.objects.all()はquerysetを設定するときに使っていましたよね。
このクエリセットに対し、さらに集計をするためのメソッドを通すというイメージです。
例:本の値段の最大値を取りたい場合
具体例として、本の値段の最大値を取りたい場合のコードをみていきましょう。
この場合は、このように書きます。
コードmaxprice = Book.objects.all().aggregate(Max('price')))
Max('price')とすることで、priceフィールドのデータからMax(最大値)を取りますという意味です。
結果は辞書型のデータです
aggregateは、querysetを受け取って、辞書型のデータを返すという点も意識しておきましょう。
コードprint(maxprice)
{'price__max': 788}
辞書型のデータが出力されました。
また、keyがprice__maxとなっています。これは、デフォルトで「フィールド名__集計の種類」と名付けられるように設定されているからです。
これはキーワード引数ですので、keyを任意の文字にしたい場合は、Max関数にkeyを与えればオッケーです。
コードmaxprice = Book.objects.all().aggregate(maximum=Max('price')))
コードprint(maxprice)
{'maximum': 788}
これが基本的なaggregateの使い方です。
aggregateで使えるメソッドと、サンプルコード
ここからは、aggregateで使えるメソッドと具体的なコードをご紹介していきます。
AVE:平均
AVEは平均値を出すときに使われます。
コードaverageprice = Book.objects.all().aggregate(Ave('price', output_field=IntegerField()))
ここで、'price'のあとにoutput_fieldという引数を設定していることに注目しましょう。
output_fieldは出力されるデータの型を設定する時に使われます。
今回は、小数点で計算される場合がおおい平均値を整数で出力するためにIntegerFieldというデータ型を設定しました。
MIN:最小値
MINは最小値を出すときに使われます。
コードaverageprice = Book.objects.all().aggregate(Min('price'))
これはMAXとほとんど同じですので、わかりやすいのではないかと思います。
COUNT:データの数
Countはデータの数を数える時に使われます。
コードaverageprice = Book.objects.all().aggregate(Count('title') / 2)
ここでは、最後に/2としていることに注目してください。
このようにすることで集計した結果を2で割っています。
aggregateメソッドは、このような使い方もできるということを頭に入れておくと良いかもしれません。
~Django無料講義~のご案内
Code for Djangoが、4時間超の無料Django講義をはじめました
- ・本を出版したCode for Djangoの 製作者が作ったサイトです。
- ・Code for Djangoの内容も、 動画で詳しく解説しています。
- ・動画は順次ふやしていきますので、 ただで学び続けることが可能です。
- ・Djangoの効率的なスキルアップに、 是非お役立て下さい。