Django ORMのモデル作成入門
フィールド定義とバリデーション
Djangoのモデル定義、フィールドの型、バリデーションの設定方法を解説します。
こんな人向けの記事です
- Djangoでモデルを定義してテーブルを作成したい人
- フィールドの型やオプションを理解したい人
- バリデーションの設定方法を知りたい人
Step 1モデルの定義
Djangoのモデルはmodels.pyに定義します。各モデルはmodels.Modelを継承したクラスとして作成します。
models.py
from django.db import models
class Company(models.Model):
name = models.CharField(max_length=200)
founding_date = models.DateField(null=True, blank=True)
def __str__(self):
return self.name
上記の例では、Companyモデルにname(文字列)とfounding_date(日付)の2つのフィールドを定義しています。__str__メソッドは管理画面やシェルでの表示名を指定します。
ポイント: Djangoではidフィールド(主キー)が自動的に追加されます。明示的に定義する必要はありません。
Step 2主なフィールドの型
Djangoで使用できる主なフィールドの型は以下の通りです。
| フィールド型 | 説明 | 使用例 |
|---|---|---|
| CharField | 短い文字列(max_length必須) | 名前、タイトルなど |
| TextField | 長い文字列 | 説明文、本文など |
| IntegerField | 整数 | 年齢、個数など |
| FloatField | 浮動小数点数 | 価格、割合など |
| DecimalField | 精度の高い小数 | 金額など |
| BooleanField | 真偽値 | 有効/無効フラグなど |
| DateField | 日付 | 誕生日、設立日など |
| DateTimeField | 日時 | 作成日時、更新日時など |
| EmailField | メールアドレス | 連絡先メールなど |
| ForeignKey | 外部キー(多対一) | 所属する会社など |
Step 3フィールドオプション
各フィールドには様々なオプションを指定できます。
models.py
class Employee(models.Model):
# 必須フィールド(blank=Falseがデフォルト)
name = models.CharField(max_length=100)
# NULL許可・空欄許可
email = models.EmailField(null=True, blank=True)
# デフォルト値あり
is_active = models.BooleanField(default=True)
# ユニーク制約
employee_code = models.CharField(max_length=10, unique=True)
# 選択肢付きフィールド
ROLE_CHOICES = [
("manager", "マネージャー"),
("staff", "スタッフ"),
]
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default="staff")
| オプション | 説明 | デフォルト値 |
|---|---|---|
| null | データベースにNULLを許可するか | False |
| blank | フォームで空欄を許可するか | False |
| default | デフォルト値 | なし |
| unique | ユニーク制約 | False |
| choices | 選択肢を制限する | なし |
| max_length | 文字列の最大長 | CharFieldでは必須 |
注意: nullとblankは役割が異なります。null=TrueはデータベースレベルでNULLを許可し、blank=Trueはバリデーション(フォーム入力)レベルで空欄を許可します。文字列フィールドではnull=Trueは避け、blank=Trueのみ使用するのが推奨です。
Step 4バリデーションの設定
Djangoではバリデーターを使って入力値のチェックを行います。
models.py
from django.db import models
from django.core.validators import (
MinValueValidator, MaxValueValidator,
MinLengthValidator, RegexValidator,
)
class Employee(models.Model):
# 文字列の最小長チェック
name = models.CharField(
max_length=100,
validators=[MinLengthValidator(2)]
)
# 数値の範囲チェック
age = models.IntegerField(
validators=[
MinValueValidator(18),
MaxValueValidator(100),
]
)
# 正規表現チェック(電話番号)
phone = models.CharField(
max_length=15,
validators=[
RegexValidator(
regex=r"^\d{2,4}-\d{2,4}-\d{4}$",
message="電話番号はXXX-XXXX-XXXXの形式で入力してください"
)
]
)
# メールアドレス(EmailFieldは自動でバリデーション)
email = models.EmailField(unique=True)
ポイント: EmailFieldやURLFieldなどは、フィールド自体にバリデーションが組み込まれています。追加のバリデーターはvalidators引数で指定します。
Step 5マイグレーションの実行
モデルを定義したら、マイグレーションを作成・実行してデータベースに反映します。
ターミナル
# マイグレーションファイルを作成
python manage.py makemigrations
# マイグレーションを実行
python manage.py migrate
実行結果
Migrations for 'myapp':
myapp/migrations/0001_initial.py
- Create model Company
- Create model Employee
Operations to perform:
Apply all migrations: myapp
Running migrations:
Applying myapp.0001_initial... OK
モデルを変更した場合も、同じ手順でmakemigrations→migrateを実行します。Djangoが変更差分を自動的に検出してマイグレーションファイルを生成します。
Step 6Metaクラスの設定
モデルのMetaクラスでテーブル名やデフォルトの並び順などを指定できます。
models.py
class Company(models.Model):
name = models.CharField(max_length=200)
founding_date = models.DateField(null=True, blank=True)
class Meta:
db_table = "companies" # テーブル名を指定
ordering = ["-founding_date"] # デフォルトの並び順
verbose_name = "会社" # 管理画面での表示名(単数)
verbose_name_plural = "会社" # 管理画面での表示名(複数)
def __str__(self):
return self.name
まとめ
- モデルは
models.pyにmodels.Modelを継承したクラスとして定義する - フィールド型(CharField, IntegerFieldなど)でデータの種類を指定する
null,blank,default,uniqueなどのオプションで制約を設定する- バリデーターを使って入力値のチェックを行う
makemigrations→migrateの2ステップでデータベースに反映するMetaクラスでテーブル名やデフォルトの並び順を設定できる