ORM

Django ORMのモデル作成入門|フィールド定義とバリデーション

Django ORM モデル

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では必須

注意: nullblankは役割が異なります。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)

ポイント: EmailFieldURLFieldなどは、フィールド自体にバリデーションが組み込まれています。追加のバリデーターは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

モデルを変更した場合も、同じ手順でmakemigrationsmigrateを実行します。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.pymodels.Modelを継承したクラスとして定義する
  • フィールド型(CharField, IntegerFieldなど)でデータの種類を指定する
  • null, blank, default, uniqueなどのオプションで制約を設定する
  • バリデーターを使って入力値のチェックを行う
  • makemigrationsmigrateの2ステップでデータベースに反映する
  • Metaクラスでテーブル名やデフォルトの並び順を設定できる