【Django】モデル(Model)の操作・データベース作成・削除方法|PythonによるWebアプリ開発#6

こんにちは、Kosei(@kay_diacc2)です!

Djangoフレームワークを活用するモデルの構築方法を詳しく解説します。そもそもモデルとは何か?の観点や、具体的なモデル構築手順に至るまで詳しい説明と図解付きです。また、モデルからデータベースにテーブル登録した後の不具合対応として、データベースの削除方法にも言及します。

目次

モデルとは

モデルとは「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を学習したい方向けにおすすめできる教材も紹介しています。是非ご覧下さい。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる