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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1380閲覧

過去のデータを古いもの順に5件まで表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/11/04 06:42

編集2017/11/04 09:12

過去のデータを古いもの順に5件まで表示させたいです。過去のテストの受験日とスコアを表示させるプログラムを書いています。views.pyに

@login_required def past_result(request): return render(request, 'past_result.html', {'chart': _view_plot(request)}) def _view_plot(request): results = TestAndUser.objects.filter(user=request.user).order_by('-date') scores = [1, 2, 3, 4, 5] dates = [results[4].date, results[3].date, results[2].date, results[1].date, results[0].date] heights = [results[4].score,results[3].score,results[2].score, results[1].score,results[0].score] image_data =[] for i in range(len(scores)): if scores[i] != None : image_data.append(scores[i]) image_data.append(dates[i]) image_data.append(heights[i]) image_scores =[] image_dates = [] image_heights = [] for j in range(0,len(image_data),3): image_scores.append(image_data[j]) image_dates.append(image_data[j+1]) image_heights.append(image_data[j+2]) plt.plot(image_scores, image_heights) plt.xticks(image_scores, image_dates) plt.fill_between(x=np.arange(1, 5, 0.01), y1=60, y2=100, facecolor='yellow', alpha=0.2) jpg_image_buffer = cStringIO.StringIO() plt.savefig(jpg_image_buffer) array = base64.b64encode(jpg_image_buffer.getvalue()) jpg_image_buffer.close() return array

とコードを書きました。
models.pyには

class TestAndUser(models.Model): dates = models.ImageField(upload_to='images', null=True, blank=True,) score = models.IntegerField(max_length=100,null=True)

とコードを書きました。
最終的には過去のテストの受験日とスコアを画像として表示させたいです。しかし、今のコードでは5つデータが入っているならエラーは出ないのですが、4つなど5つ未満の場合list index out of range とエラーが出ます。エラーが出る原因はわかっていて、results[4]などがないからだと思っています。
models.pyのdatesには20170809(2017年8月9日の意味)や20161203などが入っていて

results = TestAndUser.objects.filter(user=request.user).order_by('-date')

で、これを最新順に並べています。例えば、3件しかデータがない時

dates = [results[4].date, results[3].date, results[2].date, results[1].date, results[0].date] heights = [results[4].score,results[3].score,results[2].score, results[1].score,results[0].score]

の部分には3つずつ古いもの順にデータが入るようにしたいです。どのようにコードを書けば期待通りのプログラムが作れますか?
現在コードは

@login_required def past_result(request): return render(request, 'past_result.html', {'chart': _view_plot(request)}) def _view_plot(request):   results = TestAndUser.objects.filter(user=request.user).order_by('-date')   print(results) dates = [r.consultation_date for r in reversed(tcresults)] heights = [r.tc for r in reversed(tcresults)] scores = [i + 1 for i in range(len(heights))] if len(scores) > 5: dates = dates[:5] heights = heights[:5] scores = scores[:5] image_data =[] for i in range(len(scores)): if scores[i] != None : image_data.append(scores[i]) image_data.append(dates[i]) image_data.append(heights[i]) image_scores =[] image_dates = [] image_heights = [] for j in range(0,len(image_data),3): image_scores.append(image_data[j]) image_dates.append(image_data[j+1]) image_heights.append(image_data[j+2]) plt.plot(image_scores, image_heights) plt.xticks(image_scores, image_dates) plt.fill_between(x=np.arange(1, 5, 0.01), y1=60, y2=100, facecolor='yellow', alpha=0.2) jpg_image_buffer = cStringIO.StringIO() plt.savefig(jpg_image_buffer) array = base64.b64encode(jpg_image_buffer.getvalue()) jpg_image_buffer.close() return array

と書きました。
print(results)ではdateの新しいもの順に<QuerySet [<TestAndUser: xxx 59>, <TestAndUser: xxx 58>, <TestAndUser: xxx 54>, <TestAndUser: xxx 52>, <TestAndUser: xxx 50>, <TestAndUser: kadena xxx>]> と表示されました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

最大5要素を抽出する例です。基本的な考えとしては

  • 必要なリストはforループで作成
  • 5件を超えたら先頭の5件だけ抽出

です。

Python

1dates = [ r.date for r in reversed(results)] 2heights = [ r.score for r in reversed(results)] 3scores = [i+1 for i in range(len(heights))] 4if len(scores) > 5: 5 dates = dates[:5] 6 heights = heights[:5] 7 scores = scores[:5]

投稿2017/11/04 06:55

編集2017/11/04 07:05
can110

総合スコア38262

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

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

退会済みユーザー

退会済みユーザー

2017/11/04 08:55

ありがとうございます。そのようにコードを書いて、6件データを入れた時古いものから5件しかデータが取得できませんでした。なぜそのようになってしまったのでしょうか?質問文に現在のコードを記載しました。
can110

2017/11/04 09:00

データの取得部分(TestAndUser.objects.filter(user=request.user).order_by('-date')?)がどのように動いているかは私には分かりません。 「5件まで表示させたい」のですから「5件を超えたら先頭の5件だけ抽出」するためのコードを回答しています。
退会済みユーザー

退会済みユーザー

2017/11/04 09:13 編集

5件を超えたら先頭の5件だけ抽出するためのコードだと私も思うのですが、最も新しいものが取得できないという状況です。質問文に追加しました。
can110

2017/11/04 10:16

末尾から5個抽出しているだけなのですが、それがなぜ/どのように意図しない結果なのかは私には分かりません。新しい・古いというのもよく分かりません。
退会済みユーザー

退会済みユーザー

2017/11/04 14:23

models.pyのdatesには20170809(2017年8月9日の意味)や20161203などが入っていて、この場合だと当たり前ですが、20170809の方が新しいデータだと考えます。
退会済みユーザー

退会済みユーザー

2017/11/04 14:28

results = TestAndUser.objects.filter(user=request.user).order_by('-date') の部分では新しいもの順にデータが取れでいるのですが、 dates = [ r.date for r in reversed(results)] heights = [ r.score for r in reversed(results)] scores = [i+1 for i in range(len(heights))] の部分ではデータが新しいデータ順など関係なくリストに格納されています。なのでおそらく上の3つの部分で期待した結果ではない結果を得ているのだと思います
退会済みユーザー

退会済みユーザー

2017/11/04 14:29

if len(scores) > 5: dates = dates[:-5] heights = heights[:-5] scores = scores[:-5] と書くことで期待した結果を(新しいもの順に5件)得られました。もっといいやり方があれば教えてください。
can110

2017/11/04 14:29

「20170809の方が新しいデータだと考えます。」についてですが、データ取得の結果として返されたresultsの並びが何をもって正しいかは、私には判断できません。データ取得部分に誤りがあるのでは?
can110

2017/11/04 14:31

なぜ「[:-5]」と書くことで期待した結果が得られたのでしょうか?説明ください。
can110

2017/11/04 14:36

そもそも質問文では「過去のデータを古いもの順に5件まで表示させたい」とあるのですが、コメントでは「期待した結果を(新しいもの順に5件)」とあります。矛盾してませんか?
退会済みユーザー

退会済みユーザー

2017/11/04 14:52

なぜデータ取得部分に誤りがあると考えましたか?
退会済みユーザー

退会済みユーザー

2017/11/04 14:52

[:-5]は末尾の5件を取得できるからです
退会済みユーザー

退会済みユーザー

2017/11/04 14:54

過去のデータを古いもの順に5件まで表示させたいは、最新の5件までのデータを取得してきて、そのデータを古いもの順に並べたい、の意です
can110

2017/11/04 15:20

それは「dates = [results[4].date, results[3].date, ~」とは異なるのですか?
can110

2017/11/04 15:22

>なぜデータ取得部分に誤りがあると考えましたか? あなたの意図しない結果になっているからではありませんか?私には分かりませんが。
can110

2017/11/04 15:24

>そもそも質問文では「過去のデータを古いもの順に5件まで表示させたい」とあるのですが、コメントでは「期待した結果を(新しいもの順に5件)」とあります。矛盾してませんか? これに対する回答をください。
退会済みユーザー

退会済みユーザー

2017/11/05 01:17

過去のデータを古いもの順に5件まで表示させたいは、最新の5件までのデータを取得してきて、そのデータを古いもの順に並べたい、が回答なのですが伝わってませんか?それで言葉足らずなのですが「過去のデータを古いもの順に5件まで表示させたい」と書きました
can110

2017/11/05 03:39

質問文では「最新の5件までのデータを取得してきて」とあり、データが6件以上くる可能性については一切触れられていません。 ですが、このコメントの最初に「6件データを入れた時」とおっしゃっています。 データ取得部分では最大でも5件しかとれないのではないのでしょうか?ですからデータ取得部分がおかしいのでは?と問うています。 繰り返しになりますが、私には取得されたリストが新しい・古いという順序は分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問