Djangoのquerysetで逆順で取得したいときにreverse()を使う時の注意点
今回はDjangoのquerysetで逆順で取得したいときにreverse()を使う時の注意点についてご紹介したいと思います。
Djangoのquerysetで逆順で取得したいときにreverse()を使う時の注意点
結論として、querysetで逆順で取得したいときは、querysetで取ってくるときにorder_byを指定してあげたものに対してでしかreverse()は適用されません。
例として次のBookモデルがあるとします。
1 2 3 4 5 6 |
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=120) # max_length=required author = models.CharField(max_length=120) # max_length=required |
DBの中身は現在こんな感じだったとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> a = Book.objects.all() >>> for aa in a: ... print(aa.title) ... print(aa.author) ... print('') ... title1 author1 title2 author2 title3 author3 >>> |
Bookオブジェクトが3つあり、titleとauthorについてそれぞれ分かりやすい名前でDBに格納されています。
まず間違った使い方として、普通にquerysetのallを使って取得してreverse()をかけてみます。
実行結果は次の通りになります。
1 2 3 4 5 6 7 8 9 10 |
>>> a = Book.objects.all() >>> a[0] <Book: Book object (1)> >>> a[0].title 'title1' >>> a.reverse()[0] <Book: Book object (1)> >>> a.reverse()[0].title 'title1' >>> |
実行結果から分かる通りまったく逆順になっておりません。
実はreverse()は既に順番が定義されているquerysetに対してにしか効果を発揮しないのです。
試しにBook.objects.all()を使うときにorder_byを使ってidの昇順で取るようにしてみましょう。
するとreverse()を使用した場合の実行結果は次のように変わります。
1 2 3 4 5 6 7 8 9 10 |
>>> a = Book.objects.all().order_by('id') >>> a[0] <Book: Book object (1)> >>> a[0].title 'title1' >>> a.reverse()[0] <Book: Book object (3)> >>> a.reverse()[0].title 'title3' >>> |
ちゃんとreverse()を使ったときに順序が逆順になっていますね。
Djangoのquerysetのreverse()を使うときは順序が指定されているquerysetでないと効果を発揮しないことを覚えておきましょう。
終わりに
今回はDjangoのquerysetで逆順で取得したいときにreverse()を使う時の注意点についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません