概要
DjangoドキュメントのチュートリアルPart3中”Write views that actually do something“では、それまで単に文字列だけを返してブラウザーに表示させていたビュー関数に、ビューでの処理を記述している。そこではデータベ ースのデータを使った処理を例にしている。
チュートリアルではこれに続いてテンプレートの扱い方を示しているが、ここではモデル操作の実装だけを取り出して整理する。
index関数の編集
チュートリアルで示されているindex
関数の編集内容は以下の通り。polls.models.Question
をインポートしていることに注意。
1 2 3 4 5 6 7 8 9 10 |
from django.http import HttpResponse from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] output = ', '.join([q.question_text for q in latest_question_list]) return HttpResponse(output) .... |
http://localhost:8000/polls/
にアクセスすると、questions
テーブルに登録されているデータが日時の新しい順に、カンマで区切られて表示される。
チュートリアルではデータが1つしか登録されていなくて分かりづらいので、もう一つデータを登録してみる。
1 |
How're you doing?, What's up? |
コードの内容
モデルインスタンスのソートと抽出
1 |
latest_question_list = Question.objects.order_by('-pub_date')[:5] |
Question
モデルの全てのインスタンスをpub_date
フィールドの降順に並べ替えて先頭から5個取出し、そのQuerySet
インスタンスをlatest_question_list
に参照させている。
モデル.objects.order_by()
でモデルのデータをソートした結果をQuerySet
として返す'-pub_date'
で降順にソート/昇順の場合は'pub_date'
[:5]
はコレクションのスライスで、先頭から5個のデータ(インデックスが5未満のデータ)を取り出す
シェルで実行してみると以下の通り。
1 2 3 |
>>> latest_question_list = Question.objects.order_by('-pub_date')[:5] >>> latest_question_list <QuerySet [<Question: How're you doing?>, <Question: What's up?>]> |
引数を'pub_date'
に変更すると並べ替え順序が昇順になり、古いデータから並べられたセットが得られる。
1 2 3 |
>>> latest_question_list = Question.objects.order_by('pub_date')[:5] >>> latest_question_list <QuerySet [<Question: What's up?>, <Question: How're you doing?>]> |
またスライスを[:1]
にすると、インデックスが0
の要素だけが得られる。
1 2 3 |
>>> latest_question_list = Question.objects.order_by('-pub_date')[:1] >>> latest_question_list <QuerySet [<Question: How're you doing?>]> |
出力文字列の構成
1 |
output = ', '.join([q.question_text for q in latest_question_list]) |
latest_question_list
の各要素を', '
をデリミターとして結合している。各要素はQuestion
モデルのインスタンスだが、__str__
メソッドが実装されているので、参照するとquestion_text
の内容が得られる。