学習目標
前回は、Pythonで作成したデータをTemplateへ渡して表示する方法を学習しました。しかし、前回のデータはプログラムの中で作成した一時的なものでした。そのため、サーバーを再起動するとデータは消えてしまいます。
実際のWebアプリケーションでは、ユーザーが登録したデータを保存し、次回アクセスしたときにも利用できる必要があります。そこで利用するのがModelです。Modelはデータベースに保存するデータの設計図となるものです。

今回はTodoアプリを例に、Modelの作成方法とデータベースへの反映方法を学習します。作成するTodoには次の情報を持たせます。
- タイトル
- 内容
- 期限
- 完了フラグ
Modelとは
Modelは、データベースに保存するデータの構造を定義するクラスです。
例えばTodoを保存する場合、
- タイトル
- 内容
- 期限
- 完了したかどうか
などの情報を持たせたいとします。これらをまとめて定義したものがModelです。Modelを作成すると、Djangoがデータベースへ保存するための仕組みを自動で用意してくれます。
models.py
Modelは各アプリのmodels.pyに作成します。
例えばTodoモデルは、次のようなイメージになります。
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
deadline = models.DateField()
completed = models.BooleanField(default=False)
Todoというクラスが、データベースの1つのテーブルになります。そしてクラス内に定義した項目が、データベースの列(カラム)になります。このように、Pythonのクラスを使ってデータベースの構造を定義できることがDjangoの特徴です。
Fieldとは
Modelに定義する各項目を**Field(フィールド)**と呼びます。Fieldにはさまざまな種類があり、保存したいデータに応じて使い分けます。今回使用するFieldは次の4種類です。
CharField
文字列を保存するFieldです。タイトルや名前など、比較的短い文字列を保存するときに使用します。
models.CharField(max_length=100)
max_lengthでは最大文字数を指定します。
TextField
長い文章を保存するFieldです。Todoの内容や説明文など、文字数が多くなる場合に利用します。
models.TextField()
DateField
日付を保存するFieldです。期限や誕生日など、年月日を管理したい場合に使用します。
models.DateField()
BooleanField
TrueまたはFalseを保存するFieldです。今回のTodoでは、「未完了」と「完了」を管理するために利用します。
models.BooleanField(default=False)
default=Falseと指定することで、新しく作成したTodoの初期値は未完了になります。
ここまでの設定内容でDjango側のModelクラスの定義は完了です。
データベースへ反映
Modelを作成しただけでは、まだデータベースには反映されません。
makemigrationsとは
作成したModelクラスをデータベースに反映するにはPythonのコマンドを使用します。
python manage.py makemigrations
プロジェクトディレクトリ(manage.pyがあるところ)にてmakemigrationsコマンドを実行します。このコマンドは、「Modelが変更されたので、このようにデータベースを変更してください」という設計図(マイグレーションファイル)を作成します。
つまり、データベースを変更するための準備を行うコマンドです。makemigrationsコマンドを実行すると、models.pyの変更内容をデータベースに反映するための中間ファイルが生成されます。migrationsディレクトリが作成され、その配下に中間ファイル(番号_クラス名_日付_時間)が作成されます。
Modelを追加したりFieldを変更したりした場合は、毎回実行します。中間ファイルが追加されます。
migrateとは
マイグレーションファイルを作成しただけでは、まだデータベースは変更されません。
実際にデータベースへ反映するには、以下のコマンドを実行します。
python manage.py migrate
migrateコマンドによって、
- Todoテーブルの作成
- Fieldの追加
- Fieldの変更
などがデータベースへ反映されます。
つまり、
- makemigrations:変更内容を作成する
- migrate:変更内容をデータベースへ適用する
という役割の違いがあります。この2つのコマンドはModelを変更した際に必ず実行することになります。また現在、各ファイルが実行済みかどうかは、作成済みのマイグレーション一覧を表示するコマンドがあります。
python manage.py showmigrations todo
マイグレーション一覧を表示するコマンドを実行すると以下のように表示されます。
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length
[X] 0003_alter_user_email_max_length
[ ] 0004_alter_user_username_max_length
myapp
[X] 0001_initial
[ ] 0002_add_field_to_model
このコマンドの結果はテーブル(クラス)単位でマイグレートが実行されているかどうかの確認です。左の枠内に「[×]」表示があるものは実行済みということになり、「[ ]」は未実行という状態を表してます。
Todoモデルを作成する
今回作成するTodoモデルには、次の4つのFieldを定義します。
| Field | 内容 |
|---|---|
| title | タイトル |
| content | 内容 |
| deadline | 期限 |
| completed | 完了フラグ |
これでTodoに必要な情報を保存できるようになります。現時点では、まだデータの登録や表示は行いません。今回は「データベースに保存するための設計図」を作成するところまでが目的です。次回以降、このModelを利用してTodoを登録・一覧表示できるようにしていきます。
Model作成からデータベース反映までの流れ
Modelを作成してデータベースへ反映する流れは次のようになります。
- models.pyにModelを作成する
- Fieldを定義する
- python manage.py makemigrationsを実行する
- python manage.py migrateを実行する
- データベースにテーブルが作成される
この流れは、今後Modelを追加・変更するたびに繰り返し行います。
まとめ
今回は、Djangoでデータを保存するためのModelについて学習しました。DjangoのModelは、データベースにどのようなデータを保存するかを定義する設計図で、通常はmodels.pyに作成します。
ModelではFieldを使って保存するデータの種類を指定します。例えば、CharFieldは短い文字列、TextFieldは長い文章、DateFieldは日付、BooleanFieldは「はい・いいえ」のような真偽値を保存するために使用します。
Modelを作成・変更した後は、makemigrationsを実行してデータベース変更用の設計図(マイグレーションファイル)を作成し、続けてmigrateを実行することで、その内容が実際のデータベースへ反映されます。
ここまでで、データベースへ保存するための準備が整いました。次回は、このTodoモデルを利用して実際にデータを登録し、データベースへ保存する方法を学習していきます。