概要
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の内容が得られる。