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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

3443閲覧

Django for分で取得したリストを逆順で表示したい

ak_suzuki

総合スコア194

Django

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/06/12 04:22

やりたいこと

売り上げなどの年次(fiscal_year)データを5年分画面に出力するアプリを作っています。

そこで、2013, 2014, 2015, 2016, 2017, 2018と、6年のデータがあった場合、直近の5年分のデータ(2014~2018)を、古い順に出力したいです。

ご教授いただければ幸いです。
よろしくお願いいたします。

環境

Python 3.6
Django 2.1.0

期待する結果

||2014|2015|2016|2017|2018|
|:--|:--:|:--:|:--:|--:|
|売上高|200|220|210|230|240|
|売上高総利益|120|180|200|180|120|

現在の結果

||2018|2017|2016|2015|2014|
|:--|:--:|:--:|:--:|--:|
|売上高|240|230|210|220|200|
|売上高総利益|120|180|200|180|120|

現在のコード

HTML

1fstatement_list.html 2 3 <div class="table-responsive" style="text-align: right;"> 4 <table width="100%" class="table display nowrap"> 5 <tr> 6 <th>決算日</th> 7 {% for item in fstatement_list %} 8 <th>{{ item.fiscal_year }}</th> 9 {% endfor %} 10 </tr> 11 <tr> 12 <th>総売上高</th> 13 {% for item in fstatement_list %} 14 <td>{{ item.pl_gross_sales|intcomma }}</td> 15 {% endfor %} 16 </tr> 17 <tr> 18 <th>売上高総利益</th> 19 {% for item in fstatement_list %} 20 <td>{{ item.pl_gross_profit|intcomma }}</td> 21 {% endfor %} 22 </tr> 23 </table>

python

1views.py 2class FstatementListView(LoginRequiredMixin, ListView): 3 model = Fstatement 4 5 def get_queryset(self): 6 fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')[:5] 7 return fstatement_list

試したこと

reversedを使ってみた

python

1views.py 2class FstatementListView(LoginRequiredMixin, ListView): 3 model = Fstatement 4 5 def get_queryset(self): 6 fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')[:5] 7 fstatement_list = fstatement_list(reversed(fstatement_list)) 8 return fstatement_list

(結果)
reversedが使えないとエラー。

リストを再度並び替えた

python

1views.py 2class FstatementListView(LoginRequiredMixin, ListView): 3 model = Fstatement 4 5 def get_queryset(self): 6 fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')[:5] 7 fstatement_list = fstatement_list.order_by('-fiscal_year') 8 return fstatement_list

(結果)
Cannot reorder a query once a slice has been taken.
というエラー。

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

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

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

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

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

m.ts10806

2019/06/12 05:03

Python良く分からないのでこちらに書きますが、 DBに対してのアクセスなら取得時のSQLのorder by をfiscal_year asc(昇順)になるように指定すれば良いように思いますが、今そのようには組まれていないということでしょうか。
nuko3

2019/06/12 06:43

.filter(company=self.request.user.profile.company)の部分を外してみて、条件なしの昇順で上位5件は取得出来ていますか?
ak_suzuki

2019/06/12 07:44

mts10806様 order_by('-fiscal_year')[:5] とすると 2013, 2014, 2015, 2016, 2017を取得し、肝心の2018が取れず、 order_by('-fiscal_year')[:-5] とすると、2014~2018が取れるのですが、出力順が2018=>2014となってしまいます。 その再並び替え方法が分からない状態です。 nuko3様 はい、all()としても取得できています。 よろしくお願いいたします。
guest

回答4

0

自己解決

自己解決しました。

{% for item in fstatement_list %}
これをすべて下記のように変えます。
{% for item in fstatement_list reversed %}

参考サイト
Stackoverflow - loop backwards using django template

これまで回答をいただきました皆様、誠にありがとうございました。

投稿2019/06/18 01:04

ak_suzuki

総合スコア194

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

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

0

クエリセットオブジェトの.reverse()を利用するのはどうですか?

def get_queryset(self): fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')[:5] return fstatement_list.reverse()

参考
https://stackoverflow.com/questions/31303327/reverse-queryset-order-in-django

投稿2019/06/17 16:12

編集2019/06/17 16:17
hood

総合スコア351

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

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

hood

2019/06/17 16:14

すいません。もうこの試みはなされていたみたいですね・・・この回答は無視していただけるとありがたいです・・・・
guest

0

QuerySetであればdesc使えるようです。
参照元

違うもの使ってたらごめんなさい。

python

1Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year').desc()[:5]

投稿2019/06/13 01:00

yayakona

総合スコア69

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

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

ak_suzuki

2019/06/13 05:48

ありがとうございます。 desc()ですと、 `'QuerySet' object has no attribute 'desc'` となってしまいました。。。 ただ、調べていくとreverse()というのがあるのを知りこれも試してみました。 これはエラーにはならず、意図通りの順序になりましたが、 出したいデータは 2014, 2015, 2016, 2017, 2018なのに、 2013, 2014, 2015, 2016, 2017 となってしまいました。
yayakona

2019/06/13 07:37

descは逆順ソートなので仕様に合っていない。 +カラムに対して用いるもののようなので2重にボケていますね 申し訳ございません。 普通にソートした後に[-5:]でいけると思います。 ```python >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a = list(range(10)) >>> a[-5:] [5, 6, 7, 8, 9] ```
ak_suzuki

2019/06/13 10:06

ありがとうございます。 ```python.py def get_queryset(self): fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year') fstatement_list = list(fstatement_list)[-5:] return fstatement_list ``` あるいは ``` def get_queryset(self): fstatement_list = list(Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')) fstatement_list = fstatement_list[-5:] return fstatement_list ``` これを試してみましたが、fstatement_listが空になってしまいます。 また、 ``` def get_queryset(self): fstatement_list = Fstatement.objects.filter(company=self.request.user.profile.company).order_by('-fiscal_year')[-5:] return fstatement_list ``` ですと `Negative indexing is not supported.` というエラーになってしまいました。。。
guest

0

こうすることがこのケースの最適解かどうかはわかりませんが、あくまでもスライスで対応するとしたら。

↓一番直感的なやり方です。

python

1>>> lst = [2018, 2017, 2016, 2015, 2014, 2013] 2>>> lst[:5][::-1] 3[2014, 2015, 2016, 2017, 2018]

↓たぶん合ってるけど、読めないのでおすすめしません。

python

1>>> lst[4::-1] 2[2014, 2015, 2016, 2017, 2018]

投稿2019/06/13 00:34

hayataka2049

総合スコア30933

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

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

ak_suzuki

2019/06/13 06:07

hayataka2049様 ありがとうございます。 [:5][::-1] [4::-1] でやってみたのですが、いずれの場合も1件も表示できなくなってしまいました。。。 ログを見ると [:5][::-1] => こちらだと2014, 2015, 2016, 2017, 2018 の順にデータは取れていますが、HTML側で出力されません。 [4::-1] => こちらだと2013, 2014の2件のデータだけが取得されていました。 ちなみにデータは、2013, 2014, 2015, 2016, 2017, 2018の6件です。 よろしくお願いいたします。
hayataka2049

2019/06/14 02:41

QuerySetに反転スライスの対応がないのかな。すみません、この回答は無視してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問