質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

330閲覧

django データベースからIDを基にデータを取得し、グラフを作成したい

yuta_big

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/11/29 13:51

現在、水泳の記録を管理・分析するアプリを作っています。

ユーザーに入力してもらい記録された情報をヴィジュアライズしようとしています。

試合の記録の一覧(Listview)から詳細画面(detailview)に遷移する際に、選択されたidを基にフィルターをかけデータベースからデータを取得し、その中から特定のカラム(例: section_25_1、 section_25_2, section_25_1 , section_25_4など)の数値をリストに入れて、折れ線グラフにしたいと考えています。

事前にx、yに値を代入してグラフを表示することはできたのですが、idを基にデータベースからデータを取得してグラフを表示しようとすると、うまくいかなくなってしまいました。

djangoを独学で学んでおり、理解の至らない部分がたくさんありますが、是非ご教授お願い致します。

参考サイト

urls.py urlpatterns = [ path('race_graph/<int:pk>/plot/', views.get_svg, name='plot') ]
models.py class Race(models.Model): STYLE_CHOICES = ( (1, '自由形'), (2, '背泳ぎ'), (3, '平泳ぎ'), (4, 'バタフライ'), (5, '個人メドレー'), ) WATER_CHOICES = ( (1, "長水路"), (2, "短水路"), ) ROUND_CHOICES = ( (1, '決勝'), (2, '準決勝'), (3, '準々決勝'), (4, '予選'), ) DISTANCE_CHOICES = ( (1, '50m'), (2, '100m'), (3, '200m'), (4, '400m'), (5, '800m'), (6, '1500m'), ) user = models.ForeignKey(CustomUser, verbose_name='ユーザー', on_delete=models.PROTECT) player = models.ForeignKey(Member, verbose_name='選手名', on_delete=models.PROTECT) game_name = models.ForeignKey(Game, verbose_name='大会名', on_delete=models.PROTECT) waterway = models.IntegerField(verbose_name='水路', choices=WATER_CHOICES) round = models.IntegerField(verbose_name='予選・決勝', choices=ROUND_CHOICES) game_date = models.DateField(verbose_name='日付') style = models.IntegerField(verbose_name='種目', choices=STYLE_CHOICES) distance = models.IntegerField(verbose_name='距離', choices=DISTANCE_CHOICES) all_time = models.DurationField(verbose_name='合計タイム') reaction_time = models.DurationField(verbose_name='リアクションタイム', blank=True, null=True) section_25_1 = models.DurationField(verbose_name='0~25m', blank=True, null=True) section_25_2 = models.DurationField(verbose_name='0~50m', blank=True, null=True) section_25_3 = models.DurationField(verbose_name='0~75m', blank=True, null=True) section_25_4 = models.DurationField(verbose_name='0~100m', blank=True, null=True) section_25_5 = models.DurationField(verbose_name='0~125m', blank=True, null=True) section_25_6 = models.DurationField(verbose_name='0~150m', blank=True, null=True) section_25_7 = models.DurationField(verbose_name='0~175m', blank=True, null=True) section_25_8 = models.DurationField(verbose_name='0~200m', blank=True, null=True) section_25_9 = models.DurationField(verbose_name='0~225m', blank=True, null=True) section_25_10 = models.DurationField(verbose_name='0~250m', blank=True, null=True) section_25_11 = models.DurationField(verbose_name='0~275m', blank=True, null=True) section_25_12 = models.DurationField(verbose_name='0~300m', blank=True, null=True) section_25_13 = models.DurationField(verbose_name='0~325m', blank=True, null=True) section_25_14 = models.DurationField(verbose_name='0~350m', blank=True, null=True) section_25_15 = models.DurationField(verbose_name='0~375m', blank=True, null=True) section_25_16 = models.DurationField(verbose_name='0~400m', blank=True, null=True)
views.py # グラフ作成 def setPlt(pk): #タイム x_list = Race.objects.filter(id=pk).values_list('section_25_1', 'section_25_2', 'section_25_3', 'section_25_4', flat=False) x = list(x_list)   #距離 y = np.array([25, 50, 75, 100]) plt.plot(x, y) # svgへの変換 def pltToSvg(): buf = io.BytesIO() plt.savefig(buf, format='svg', bbox_inches='tight') s = buf.getvalue() buf.close() return s def get_svg(request, pk): setPlt(pk) # create the plot svg = pltToSvg() # convert plot to SVG plt.cla() # clean up plt so it can be re-used response = HttpResponse(svg, content_type='image/svg+xml') return response

html

1{% extends 'base.html' %} 2{% load static %} 3 4{% block title %}RACE詳細 | SPN {% endblock %} 5 6{% block head%} 7{% endblock %} 8 9{% block header%} 10{% endblock %} 11 12{% block contents %} 13<body class="container"> 14 <h1 class="display-4 text-primary"> 15 詳細表示 </h1> 16 17 <div class="row"> 18 <div class="col-12"> 19 <a class="btn btn-outline-secondary float-right" href="{% url 'race:list' %}">戻る</a> 20 </div> 21 </div> 22 23 <table class="table"> 24 <tr> 25 <th>日付</th> 26 <th>大会</th> 27 <th>選手</th> 28 <th>種目</th> 29 <th>距離</th> 30 <th>記録</th> 31 </tr> 32 33 <div class="post-preview"> 34 35 36 <tr> 37 <td>{{race.game_date}}</td> 38 <td>{{race.game_name}}</td> 39 <td>{{race.player}}</td> 40 <td>{{race.get_style_display}}</td> 41 <td>{{race.get_distance_display}}</td> 42 <td>{{race.all_time}}</td> 43 <tr> 44 </div> 45 </table> 46 47 <img src="{% url 'race:plot' object.pk %}" width=600 height=600> 48 49 <div class="row"> 50 <div class="col-12"> 51 <a class="btn btn-outline-secondary float-right" href="{% url 'race:list' %}">戻る</a> 52 <a class="btn btn-success mt-5 mb-3" href="{% url 'race:update' race.pk %}">編集</a> 53 <a class="btn btn-danger mt-5 ml-2 mb-3" href="{% url 'race:delete' race.pk %}">削除</a> 54 </div> 55 </div> 56 </div> 57</body> 58 59{% endblock %} 60コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問