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

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

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

目次

【Django】モデルとは

モデルとは「Webアプリとデータベース間のやりとりを担うコンポーネント」です。

上図のDjango設計思想であるMVTアーキテクチャをもとに、モデルの役割を詳しく見ていきましょう!

例えば、Webサイトにログインすると、View(コントローラー)に情報が送信され、Viewがその情報をモデルに転送します。モデル(Model)は、モデル内にプログラムされたビジネスロジックに基づき、データベースに情報を保存する役割を担います。

具体的に下図具体例を用いて、モデル・データベース間の挙動を見てみましょう。

モデルの中身には一般的にテーブルの内容を定義したクラスが準備されます。モデル内にクラスを定義すると、その情報がデータベースに連携されるため、DB内にテーブルを作成できるようになります。加えて、データベースにテーブルが作成されると、レコードを格納する仕組みも構築できたことを意味します。

それでは以下より実際にプログラムを記述しながらモデルの構築方法を理解していきましょう!

【Django】モデル構築・データベースのテーブル作成・削除

モデル作成の全体像として本記事では上記3つの手順を詳しく解説します。

①〜②はモデル作成からデータベースにテーブル情報を適用までの手順に該当します。

加えて、使用頻度は少ないですが、データベースの情報をリセットしたい場合の手順も後述します。万が一のトラブルの際に覚えておくと便利でしょう。

【参考】マイグレーションとは(Migrations)

マイグレーションとは、models.pyにモデルクラスとして定義したマスタ情報をデータベースに連携し、データベース内にテーブルとして反映する機能を意味します。

models.pyにモデルクラスを作成したり、更新した際には必ずマイグレーション作業が必須となります。

このマイグレーション方法についても詳しく後述します。

【参考】データベースのテーブル作成時に検討するフォルダ構成

テーブルを作成する際のデータベースとして、db.sqlite3がDjangoのデフォルトとして備わっています。

テーブル作成のために行うモデルクラスは、一般的にDjango環境構築時に作成されたアプリケーションフォルダ直下のmodels.pyに記述していきます。

本記事でもその理念に基づき、上記のようなフォルダ構成のもと、モデルを構築していくこととします。

【Django】モデルクラスの定義|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()                         # フリーテキスト

    # テキスト表示
    def __str__(self):
    	return self.name

【参考】モデルクラスのひな型コード

モデルクラスは、django.db.modelsにあるModelクラスを継承して作成します。

書き方の規則は、下記のようになります。クラスの中には保管する値に関する項目を用意します。

class モデルクラス名(models.Model):
  項目1 = フィールドクラスのインスタンス
  項目2 = フィールドクラスのインスタンス
  項目3 = フィールドクラスのインスタンス

【参考】モデルクラスに定義する代表的な入力フィールド

models.pyのモデルクラス定義時に用意する項目には、さまざまな入力フィールドを設定することができます。用途に応じて次のようなフィールドが代表的に用いられます。

【Django】マイグレーションを実行・データベースを作成

次に、モデルクラスで定義したテーブルをデータベースに移行するために、マイグレーションを実行します。マイグレーションの実行では、①マイグレーションフォルダを作成し、②マイグレーションを実行するという手順で行われます。

マイグレーションフォルダを作成

まず、ターミナルウィンドウを開き、上記「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のモデルクラスで定義した内容をデータベースのテーブルとして適用するためのものです。

これでマイグレーション実行作業は全て完了です!これでモデルクラスで定義したテーブルが、データベースに反映されました。

【不具合対応】Django SQLite3のデータベース削除

最後に、データベースの削除方法について触れます。例えば、models.pyに誤った内容が登録されたり、データベース自体に不具合が生じた際に、この方法を検討してみてください。今回データベースは、SQLite3を用いることとします。

※事前に管理ユーザーをDjangoに登録している場合、管理ユーザー情報も消えてしまうため、メモ等残しておきましょう。

マイグレーションフォルダを削除

まず、ターミナルウィンドウを開き、上図アプリケーション管理フォルダ内のマイグレーションフォルダ(migrations)があるディレクトリに移動します。

続いて、ターミナル以下のように入力します。

rm -d -r migrations/

上記実行後、「削除しますか?」という質問が表示されるため、以下のように全て’y'(yes)として回答します。それにより、マイグレーションフォルダが削除されます。

examine files in directory migrations/__pycache__?              y
remove migrations/__pycache__/__init__.cpython-38.pyc?          y
remove migrations/__pycache__/0001_initial.cpython-38.pyc?      y
remove migrations/__pycache__?                                  y
remove migrations/0001_initial.py?                              y
remove migrations?                                              y

データベース(SQLite3)を削除

次にデータベースを削除します。ターミナルウィンドウをもとに、上図db.sqlite3があるディレクトリに移動し、以下を入力しましょう。

rm -d -r db.sqlite3

上記を入力するとsqlite3を削除しても良いか再度聞かれるため、’y’と回答しEnterを押下します。

remove db.sqlite3? y

これでデータベースの削除が完了しました。改めてデータベースを作成し、モデルクラスを適用する際は、下記のマイグレーション再実行プロセスを実施してみましょう。

マイグレーションを再実行

最後に、マイグレーションを再実行します。ターミナルウィンドウを開き、「manage.py」があるディレクトリ上で以下のように入力しましょう。

①マイグレーションフォルダを再作成

python manage.py makemigrations App_Folder

②マイグレーションを適用

python manage.py migrate

【参考】Djangoの解説記事一覧

最後までご覧いただきありがとうございました。当サイトではDjangoフレームワークを用いた解説記事を多数取り扱っております。次のように体系的に整理しておりますため学習にお役立て下さい。

Django学習に最適!

当サイトが運営するDjango記事一覧

【参考】Pythonでできること・お仕事探し

最後に

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

本記事をシェア!
目次