Djangoモデルの日付データをChart.jsのx軸に設定する
はじめに
Djangoで作成したアプリに含まれる日付データをChart.jsのx軸に設定し、
時系列のグラフを描画するにはどうすれば良いのでしょう?具体的に紹介します。
目次
1, 目標: 日付データを描画したグラフ例
下図のようにx軸に日付を描画することを目指します。
2, フォルダ構成
下記フォルダ構成の4つのファイル(★)を通じて紹介します。
※ このアプリ作成時に参考にしたテンプレートを下記で紹介しています。
cream-kuchen.hatenablog.com
3, 日付型のデータ定義 (models.py)
models.pyで、モデル名をクラス「Item」、日付データ名を変数「date」として定義します。
from django.db import models class Item(models.Model): date = models.DateField( verbose_name='date', blank=False, null=False, )
4, テーブルの日付データ例
データが格納されたテーブル (app_item) の中身は、下記のようになります。
※ テーブルの名前が「アプリ名_モデルのクラス名」になる理由は下記を参照してください。
cream-kuchen.hatenablog.com
5, 日付データの受け渡し (views.py)
views.pyで、日付データをテーブルから取得しhtml画面に投げます。
from django.views.generic import TemplateView from .models import Item # 日付型のデータを定義したモデルのクラス名 class ResultView(TemplateView): template_name = 'app/result.html' # グラフ描画するhtml画面 context_object_name = 'object' def get_context_data(self, **kwargs): # html画面に投げる日付データの設定 context = super().get_context_data(**kwargs) # 日付順にデータを並び替えて、日付のカラムをリストで取得 date_list = list(Item.objects.all().order_by('date').values_list('date', flat=True)) # 日付データを「YYYY-mm-dd」の文字列に変換 date_str = [i.strftime("%Y-%m-%d") for i in date_list] # 加工した日付データを格納しなおし、html画面に投げる context['date'] = date_str return context
6, URL遷移の設定 (urls.py)
urls.pyでトップページからグラフ画面に飛べるように設定します。
from django.urls import path from .views import ResultView urlpatterns = [ path('result/', ResultView.as_view(), name='result'), ]
7, 画面にグラフ描画 (result.html)
result.htmlで、日付データをChart.jsのx軸に設定します。
※ 簡便化のためy軸のデータ描画等は省略しています。
<!doctype html> <html> <head> <title>Chart.js_xaxis_date_plot</title> <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.js'> </script> </head> <body> <canvas id='line-chart' height='140px'></canvas> <script type='text/javascript'> var ctx = document.getElementById('line-chart'); var myLineChart = new Chart(ctx, { type: 'line', options: { scales: { xAxes: [{ type: 'time', distribution: 'series', <!-- 'linear' もある--> time: { parser: 'YYYY-MM-DD', <!-- views.pyで加工した日付文字列 --> format: 'YYYY-MM-DD', <!-- views.pyで加工した日付文字列 --> unit: 'day', displayFormats: { day: 'M/D' <!-- 多様な描画方法あり --> } }, ticks: { source: 'labels' } }] } } }); </script> </body> </html>
※ distributionやdisplayFormats等の可視化方法は、下記を参照し自分好みにしてください。
おわりに
Djangoモデルの日付データをChart.jsのx軸に設定する方法を紹介しました。
日付データの受け渡しにひと手間掛かりますが、役立てて頂ければ幸いです。