ジャンゴ② データベース
モデルを確認する
変更する箇所はありませんが、myproject/garden/models.pyにデータの定義が記述されています。
このファイルに記述されているクラスをモデルと呼びます。
Vegetable クラスはデータベースの vegetable テーブルと紐付いています。
Vegetableクラスに各要素の定義があります。確認しましょう。
Vegetableクラスは要素として、名前name、値段price、説明description、生産者producer、売り切れsold_out、登録日created_atを持っています。
またクラスに書いてはいませんが、idという主キーフィールドも持っています(Djangoが自動で設定します)。名前も固定で自動で作成される一意なキーです。
必要に応じて細かく解説します。モデルVegetableはデータベースのvegetableテーブルと紐付いており、各カラムと紐づく情報を持っていると認識してください。
モデルは事前にPyQが設定したものです。モデルの作成方法はここでは説明しません。
モデルを使う
モデルVegetableから、データの一覧を取得しましょう。
from garden.models import Vegetableを記述し、Vegetableをインポートします
vegetables = Vegetable.objects.all()で、データを取得します
TemplateResponse()の第3引数に取得したvegetablesをレスポンスのコンテキストとして渡します。
データの表示
画面にループを用いて、一覧を表示します。テンプレートを変更します。
テンプレートでfor文を利用するには、{%と%}で囲みます
forの最後にセミコロン(:)は必要ありません
ループ処理の終わりに{% endfor %}を書きます。endとforは続けて書きます。スペースを空けないように注意してください
from random import choice
from django.template.response import TemplateResponse
from garden.models import Vegetable
name = 'ウメ'
sub_titles = ['美味しいよ!', 'お買い得!', '産地直送!', 'とれたてをお届け!']
def index(request):
"""メイン画面."""
# タイトルを作成
title = name + 'の野菜販売'
# サブタイトルを決定
sub_title = choice(sub_titles)
#野菜一覧
vegetables = Vegetable.objects.all()
return TemplateResponse(request, 'garden/index.html',
{'title': title,
'sub_title': sub_title,
"vegetables": vegetables})
モデル
Djangoでデータを扱うには、モデルを利用します。
Djangoを利用する場合、モデルを利用することにより利用しているデータベースを意識せずにデータを利用できます。
1つのモデルはデータベースの1つのテーブルに紐付いています。モデルを利用して、テーブルからデータを読み取ります。
詳しくは、モデルを参照ください。
models.pyに定義されているクラスVegetableからデータベースのテーブルに保存されている値を取り出せます。全てのデータを取得する場合、Vegetable.objects.all()と書きます。
データはdjango.db.models.query.QuerySet型で取得されます。リストのようにVegetableオブジェクトがデータベースからの取得順に格納されています。
各データを取り出して利用できます。
Vegetableオブジェクトの各要素はオブジェクト名.要素名で取得できます。vegetable.nameで名前に保存されている値を取得しています。
class Vegetable(models.Model):
""" 野菜."""
name = models.CharField('名前', max_length=100)
price = models.IntegerField('値段', default=0)
description = models.TextField('説明')
producer = models.CharField('生産者', max_length=50, default='ウメ')
sold_out = models.BooleanField("売り切れ", help_text="売り切れの場合True",
default=False)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.name
class Meta:
db_table = 'vegetable'
verbose_name = verbose_name_plural = '野菜'