ジャンゴ② データベース

モデルを確認する
変更する箇所はありませんが、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 = '野菜'