Django:Views.pyでmodels.modelを使い日付毎の集計を行う方法

Django:Views.pyでmodels.modelを使い日付毎の集計を行う方法

Django:Views.pyでmodels.modelを使い日付毎の集計を行う方法

本当はpandasによる集計で完結したかったのですが、グラフを書こうとしたら「そうもいかない事情」が発生。

グラフ描写プラグインに【 [UNIX時, 値] 】の配列で渡さないといけない

せかっくPandasで集計したのでコレを生かしたかったのですが、DataFrameにしたものをまたListに戻すと言うどうも納得できない処理が発生したので「だったらSQL側で抽出しよう」との考えに至りました。

構成の概要

■models.py

■urls.py

こんな感じでmodelsに登録しました。

repo/<int:pk>でクライアント毎の集計データをグラフで表現し最終的に下のようなグラフに描写します。

日間売上集計

Views.pyでmodels.modelクラスを継承してGroup_by & SUMを実行

30行目~31行目:日毎sum集計の解説

前段の25行目~27行目でクライアントデータと端末(総合)の抽出が終わっています。

30行目では d_box で抽出した値から日付データを選択し昇順並替えを実行しています。

注目点はこの【 オブジェクト名.values(‘集計区分’)】の場所です。

例えば、ここを [ d_box.values(‘observation_date’,’sales’) ] とした場合、observation_dateとsalesの2軸でGroup_byが実行されます。

なので、例えば端末ごとの集計を出したい時などは下のようにすればOKです。

31行目はWEB上に誤った情報を多く見かけました。

… annotate(total_sale=Sum(‘sales’)) のSumは【sum】が正しい

sumでも間違いと言う事はできません。ただし、select でSQLを直接呼び出すなど今回とは違うルートで合算する場合です。models.modelからのルートの場合は【 Sum 】が正しいです。

unsupported operand type(s) for +: ‘int’ and ‘str’が発生する

models.modelクラスでsumを使うと文字列は集計できないとエラー発生

これは「modelから送られてくるときに数値をテキスト化しているから」なのだそうです。
※この理由については真実性を確かめる事が出来ませんでしたが、sumとした場合のエラー再現性は100%でした。
上記エラーを回避するために利用するのが【from django.db.models import Avg, Count, Min, Sum】です。
ぱっと見でわかる通り、modelsクラスで平均、カウント、集計などを使える様にします。

models.modelクラスを継承しての集計はこのSumを使うので「sumではないよ、Sumなのよ」となります。

まとめ

分析ページ内に複数のグラフを配置したいのですが、グラフ用の配列を作るのが結構大変です。

「きっと上手くやる方法あるんだろうなぁ」と思いながら取り合えず力業でもがいています。