こんにちは、Kosei(@kay_diacc2)です!
モデルとは

モデルとは「Webアプリとデータベース間のやりとりを担うコンポーネント」です。上図のDjango設計思想であるMVTアーキテクチャをもとに、モデルの役割を詳しく見ていきましょう!
例えば、Webサイトにログインすると、View(コントローラー)に情報が送信され、Viewがその情報をモデルに転送します。モデル(Model)は、モデル内にプログラムされたビジネスロジックに基づき、データベースに情報を保存する役割を担います。
具体的に下図具体例を用いて、モデル・データベース間の挙動を見てみましょう。

モデルの中身には一般的にテーブルの内容を定義したクラスが準備されます。モデル内にクラスを定義すると、その情報がデータベースに連携されるため、DB内にテーブルを作成できるようになります。加えて、データベースにテーブルが作成されると、レコードを格納する仕組みも構築できたと言えます。
それでは以下より実際にプログラムを記述しながらモデルの構築方法を理解していきましょう!
モデル作成の全体像
本記事ではモデル作成の全体像として下記範囲をご紹介します。①〜②はモデル作成からデータベースにテーブル情報を適用までの手順に該当します。加えて使用頻度は少ないですが、データベースの情報をリセットしたい場合の手順も示します。

マイグレーションとは

ここで、マイグレーション(Migration)とは何か事前に説明します。マイグレーションは、モデルクラスで定義した情報をデータベースに連携し、データベース内にテーブル情報として反映する機能を意味します。
モデル作成時に検討するフォルダ構成

一般的にモデルは、作成したアプリケーションフォルダに対して1つずつmodels.pyとして準備されます。本記事でもその理念に基づき、上記のようなフォルダ構成のもと、モデルを構築していくこととします。
モデルクラスを作成(models.py)
アプリケーション管理フォルダ(App_Folder)内のmodels.pyを開き、モデルクラスを以下のように作成してみましょう!今回は「People」というクラスを定義し、その中に個人情報を変数として定義します。
# モデルを読み込み
from django.db import model
# モデルクラスを作成する
class People(models.Model):
Name = models.CharField(max_length=100) # 文字列
Tell = models.IntegerField(blank=True, null=True) # 整数
Mail = models.EmailField(max_length=100) # Email
Birthday = models.DateField() # 日付
Website = models.URLField() # URL
FreeText = models.TextField() # フリーテキスト
モデルクラスは、django.db.modelsにあるModelクラスを継承して作成します。記載方法は、下記のようになります。
class モデルクラス名(models.Model):
変数1 = フィールドクラスのインスタンス
変数2 = フィールドクラスのインスタンス
変数3 = フィールドクラスのインスタンス
マイグレーションを実行・データベースを作成
次に、モデルクラスで定義したテーブルをデータベースに移行するために、マイグレーションを実行します。マイグレーションの実行では、①マイグレーションフォルダを作成し、②マイグレーションを実行するという手順で行われます。
マイグレーションフォルダを作成

まず、ターミナルウィンドウを開き、上記「manage.py」ファイルが格納されたディレクトリに移動します。マイグレーションフォルダ作成のために、以下をコマンドに入力しましょう。
python manage.py makemigrations App_Folder(アプリケーションフォルダ名)
上図のディレクトリを例に紹介すると、アプリケーション管理フォルダ(App_Folder)内のmodels.pyにモデルクラスを記載したため、App_Folderに対してマイグレーションフォルダを作成しました。
ターミナルでコマンド実行後、以下のように表示された場合、問題なくマイグレーションフォルダが作成できたことを意味します。
$ python manage.py makemigrations App_Folder Migrations for 'App_Folder':
App_Folder/migrations/0001_initial.py
- Create model People
下記ディレクトリにマイグレーションフォルダ(migrations)が作成されていることを確認してみましょう。

マイグレーションを実行
続いて、データベースにマイグレーションを実行する作業について解説します。ターミナルウィンドウを開き、「manage.py」ファイルがあるディレクトリに移動し、以下のように入力しましょう。
python manage.py migrate
実際に入力すると、ターミナル上に出力結果が表示されます。以下のように確認できればマイグレーション実行完了です!
$ python manage.py migrate
Operations to perform:
Apply all migrations: App_Folder, admin, auth, contenttypes, sessions
Running migrations:
Applying App_Folder.0001_initial... OK
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
マイグレーションファイルを確認
念の為、作成したマイグレーションフォルダ(migrations)内のファイルを確認してみましょう。マイグレーションフォルダには、「001_initial.py」というマイグレーション実行ファイルが格納されているかと思われます。このファイルを開くと以下のように記述されています。
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='People',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('Name', models.CharField(max_length=100)),
('Tell', models.IntegerField(blank=True, null=True)),
('Mail', models.EmailField(max_length=100)),
('Birthday', models.DateField()),
('Website', models.URLField()),
('FreeText', models.TextField()),
],
),
]
Migrationクラスとはdjango.db.migrationsのクラスを継承して作られます。その中には、migrations.CreateModelという記載があり、models.pyのモデルクラスで定義した内容をデータベースのテーブルとして適用するためのものです。
これでマイグレーション実行作業は全て完了です!これでモデルクラスで定義したテーブルが、データベースに反映されました。
【不具合対応】データベースの削除(SQLite3)
最後に、データベースの削除方法について触れます。例えば、models.pyに誤った内容が登録されたり、データベース自体に不具合が生じた際に、この方法を検討してみてください。今回データベースは、SQLite3を用いることとします。
※事前に管理ユーザーをDjangoに登録している場合、管理ユーザー情報も消えてしまうため、メモ等残しておきましょう。
マイグレーションフォルダを削除

まず、ターミナルウィンドウを開き、上図アプリケーション管理フォルダ内のマイグレーションフォルダ(migrations)があるディレクトリに移動します。
続いて、ターミナル以下のように入力します。実行後マイグレーションフォルダが削除されます。
rm -d -r migrations/
データベース(SQLite3)を削除

次にデータベースを削除します。ターミナルウィンドウをもとに、上図「db.sqlite3」があるディレクトリに移動し、以下を入力しましょう。
rm -d -r db.sqlite3
これでデータベースの削除が完了しました。改めてデータベースを作成し、モデルクラスを適用する際は、下記のマイグレーション再実行プロセスを実施してみましょう。
マイグレーションを再実行
最後に、マイグレーションを再実行します。ターミナルウィンドウを開き、「manage.py」があるディレクトリ上で以下のように入力しましょう。
①マイグレーションフォルダを再作成
python manage.py makemigrations App_Folder
②マイグレーションを適用
python manage.py migrate
Djangoまとめ
最後までご覧いただきありがとうございました。当サイトではDjangoフレームワークを用いた用途別解説記事を多数取り扱っております。是非合わせてご覧ください。
Djangoブログ記事一覧
Djangoフレームワークを用いたWebアプリ作成の基礎から応用に至るまで体系的に解説した記事を配信しています。
Djangoを学習したい方向けにおすすめできる教材も紹介しています。是非ご覧下さい。
Django学習におすすめな教材7選
Django学習をするなら必見!非常におすすめできる学習教材を紹介します。
最後に

お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら