- Djangoのモデルの書き方がわからない
- フィールドの種類が多くて何を使えばいいか迷う
- テーブル同士のリレーションをどう定義するか知りたい
- マイグレーションの仕組みをちゃんと理解したい
この記事ではDjangoモデルの基本的な書き方から、よく使うフィールドの種類、テーブル間のリレーション設計、マイグレーションの仕組みまでをまとめて解説します。
モデルはDjangoの中心的な概念です。ここをしっかり理解しておくと、その後の開発がぐっとスムーズになります。
この記事を読む前に
- Djangoのプロジェクト・アプリ構成を理解していること
まだの方はこちら →
Djangoモデルとは
Djangoのモデルは、データベースのテーブル構造をPythonクラスで表現したものです。
モデルを定義すると、DjangoがそのクラスをもとにSQLを自動生成してテーブルを作ってくれます。SQLを直接書く必要はありません。
- モデルクラス
Pythonクラス 1つ = データベーステーブル 1つ - フィールド
クラスの属性 1つ = テーブルのカラム 1つ - マイグレーション
モデルの変更内容をDBに反映する仕組み
基本的なモデルの定義
モデルは django.db.models.Model を継承したクラスとして models.py に書きます。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
published_at = models.DateTimeField(auto_now_add=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title__str__ は管理画面やシェルでオブジェクトを表示するときに使われる文字列を返します。必ず定義しておく習慣をつけましょう。
よく使うフィールド一覧
Djangoには用途ごとに多くのフィールドが用意されています。よく使うものをまとめました。
| フィールド | 用途 | 主なオプション |
|---|---|---|
CharField | 短いテキスト(タイトル・名前など) | max_length(必須) |
TextField | 長いテキスト(本文・説明文など) | — |
IntegerField | 整数 | — |
FloatField | 浮動小数点数 | — |
DecimalField | 固定小数点数(金額など) | max_digits decimal_places(必須) |
BooleanField | 真偽値 | default |
DateField | 日付 | auto_now auto_now_add |
DateTimeField | 日時 | auto_now auto_now_add |
EmailField | メールアドレス(形式バリデーション付き) | max_length |
URLField | URL(形式バリデーション付き) | — |
ImageField | 画像ファイル | upload_to |
FileField | 任意のファイル | upload_to |
JSONField | JSONデータ | — |
フィールドオプション
フィールドには共通して使えるオプションがあります。よく使う4つを覚えておけば十分です。
null=True
DBのカラムにNULLを許可する。指定しない場合はNULLなし(デフォルトFalse)blank=True
Djangoフォームの入力バリデーションで空欄を許可する(デフォルトFalse)default
値が指定されなかったときのデフォルト値verbose_name
管理画面などに表示されるラベル名(日本語化に使う)unique=True
カラムに一意制約を付ける(重複値を禁止)
実際のコード例です。
class Product(models.Model):
name = models.CharField(
max_length=100,
verbose_name="商品名",
unique=True,
)
description = models.TextField(
blank=True,
default="",
)
price = models.IntegerField(
null=True,
blank=True,
)Metaクラス
モデルの内部に Meta クラスを書くと、テーブルの動作を細かく設定できます。
class Article(models.Model):
title = models.CharField(max_length=200)
published_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["-published_at"]
verbose_name = "記事"
verbose_name_plural = "記事一覧"ordering
デフォルトのソート順。"-published_at"はマイナスで降順(新しい順)verbose_name
管理画面での単数形の表示名verbose_name_plural
管理画面での複数形の表示名(設定しないと自動で末尾に “s” がつく)
リレーション
複数のテーブルを関連付けるリレーションは3種類あります。
ForeignKey(多対1)
「記事は1つのカテゴリに属する」「1つのカテゴリには複数の記事がある」といった多対1の関係に使います。最もよく使うリレーションです。
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
category = models.ForeignKey(
Category,
on_delete=models.CASCADE,
related_name="articles",
)on_delete=models.CASCADE
親レコード(Category)を削除したとき、紐づく子レコード(Article)もまとめて削除するon_delete=models.SET_NULL
親を削除したとき、子のFK列をNULLにする(null=Trueとの併用が必要)related_name
逆方向アクセス時の名前。category.articles.all()のように使える
OneToOneField(1対1)
「ユーザー1人につきプロフィール1つ」のような1対1の関係に使います。Djangoの標準Userモデルを拡張するときの定番パターンです。
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
related_name="profile",
)
bio = models.TextField(blank=True)ManyToManyField(多対多)
「記事には複数のタグが付けられる。タグは複数の記事に付けられる」といった多対多の関係に使います。Djangoが自動的に中間テーブルを作成してくれます。
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(
Tag,
blank=True,
related_name="articles",
)マイグレーション
モデルを定義・変更したら、マイグレーションでDBに反映します。2ステップで完了します。
Step 1: makemigrations(変更を検知してファイル生成)
モデルの変更内容をマイグレーションファイルとして生成します。実際のDBにはまだ反映されません。
python manage.py makemigrations実行すると migrations/0001_initial.py のようなファイルが生成されます。このファイルはGitで管理してください。
Step 2: migrate(DBに反映)
生成されたマイグレーションファイルをDBに適用してテーブルを作成・変更します。
python manage.py migrateマイグレーション状態の確認
どのマイグレーションが適用済みかを確認するには showmigrations を使います。[X] が適用済み、[ ] が未適用です。
python manage.py showmigrationsロールバック(元に戻す)
特定のバージョンまで戻したい場合は、アプリ名とマイグレーション番号を指定します。
python manage.py migrate myapp 0001まとめ
この記事ではDjangoモデルの基本から実践的な設計パターンまでを解説しました。
- モデルはPythonクラスでDBテーブルを表現する
- フィールドの種類とオプション(null・blank・default)を正しく使い分ける
- リレーションは ForeignKey / OneToOneField / ManyToManyField の3種類
- モデル変更後は makemigrations → migrate の2ステップでDBに反映する
モデルが定義できたら、次はデータの取得・更新・削除を行うQuerySet操作を学びましょう。
Djangoロードマップ全体はこちらから確認できます。

コメント