選択肢
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 4/23。
ジャンルは任意のテキストではなく、いくつかの値の中から選ぶべきです。choicesオプションを使うと、列挙クラスで指定したリストにフィールドの値を制限できます。映画サイトでは、映画の対象年齢を制限できます。
class Movie(models.Model):
class Age(models.TextChoices):
ALL = "all", "All ages"
TEEN = "teen", "13 and over"
ADULT = "adult", "18 and over"
age = models.CharField(max_length=10, choices=Age, default=Age.ALL)各メンバーには、データベースに保存される値("teen")と、ユーザーに表示されるラベル("13 and over")があります。コードではMovie.Age.TEENと書くため、タイプミスは新しい値になるのではなく、エラーになります。このクラスは、それを使うフィールドより前に定義します。
フォームと管理画面ではラベルがドロップダウンに表示され、ほかの値は受け付けません。データベース自体は値をチェックしません。movie.get_age_display()は、その行のラベルを返します。
チャレンジ
簡単Bookにジャンルを設定します。フィールドの上に、選択肢クラスGenreを書きます。
FICTION:"fiction","Fiction"SCIFI:"scifi","Science fiction"MYSTERY:"mystery","Mystery"HISTORY:"history","History"
次に、最大20文字で、これらの選択肢に限定され、別のものを選ばない限りfictionが初期値となるフィールドgenreを追加します。
ShellタブでBook.Genre.SCIFI.labelと入力すると、'Science fiction'が表示されます。
自分で試してみよう
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
year = models.IntegerField()
price = models.DecimalField(max_digits=6, decimal_places=2)
is_read = models.BooleanField(default=False)
finished = models.DateField(null=True, blank=True)
summary = models.TextField(blank=True)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド