【Django】Model(モデル)とは:models.pyの書き方とデータベース連携(テーブル作成)

2021.06.03 /

【Django】Model(モデル)とは:models.pyの書き方とデータベース連携(テーブル作成)

本記事では、PythonのWebフレームワークであるDjangoにおける、Model(モデル)によるデータベース連携(テーブル作成)について詳しく解説していきます。

Webアプリケーションを作成する上でデータベースは非常に重要な要素です。
Djangoでデータベースを操作するためには、モデルModelという仕組みを使用します。

ビューViewではviews.py、URLルーティングにはurls.py、モデルModelにはmodels.pyをそれぞれ使います。

ここではmodels.pyを使ったデータベース連携や、テーブル作成まで詳しく見ていきましょう。

本記事を通して以下の知識を学べます。

学べる知識
  • DjangoのMTVフレームワークについて
  • モデルModelについて
  • モデルの定義方法
  • モデルをデータベースに反映する方法

Django

Djangoとは

Djangoとは、Pythonによるフレームワークの1つです。
Webアプリケーション開発に適したフレームワークであり、様々な機能を有しています。

Pythonのフレームワークの中では、最も人気・知名度が高いです。

作成したいWebアプリケーションが小規模でも大規模でも、どんなシステムにも対応できます。

Djangoを使うことで1からWebアプリケーションを作成するよりも、大幅に時間を節約することができます。
Djangoのような開発に必要な機能が揃っているフレームワークをフルスタックフレームワークと呼ばれます。

総じて次のメリットがあると言えます。

  • 開発のスピードの向上・効率化
  • コーディング量の削減によるミスやエラーの現象

MTVフレームワーク

DjangoはMTV(モデル・テンプレート・ビュー)という設計手法が使われています。

MはModel(モデル)、TはTemplate(テンプレート)、VはView(ビュー)を表します。
それぞれ次の機能を有します。

  • Model(モデル):データベースとの連携を行う。該当ファイルはmodels.py
  • Template(テンプレート):フロントエンド(HTML)を扱う。該当ファイルはtemplatesフォルダ内のhtmlファイル
  • View(ビュー):バックエンドを扱う。該当ファイルはviews.py

その他にルーティングに関しては、URLs(urls.py)を使用しています。

MTVの関係は次図のようになります。

Django:MTVの関係

本記事では、MTVのM(モデル)、データベースと連携を行う仕組みについて詳しく解説しています。

モデルの該当ファイルであるmodels.pyの書き方から、データベースに反映する方法まで見ていきましょう。

モデルModel

モデルModelとは

モデルとは、Webアプリケーションとデータベースを連携させる仕組みのことです。
モデルはデータベースに格納されているデータにアクセスすることができます。

Djangoではモデルを使うことで、非常に簡単にデータベースからデータの検索・取得・追加・削除といった一連のデータベース操作を行うことができます。

モデルは次のような特徴とルールを持っています。

  • 各アプリケーション内のmodels.pyを使用する
  • 1つのモデルが1つの(データベース内の)テーブルと対応する
  • Pythonのクラスであり、django.db.models.Modelのサブクラス
  • モデル名は大文字で始める
  • idフィールドは自動的に追加される(Primary keyを定義しない場合)
  • フィールドのオプションで何も指定しなければNOT NULL制約がかかる

モデルを定義してデータベースに反映するまでの流れは次のようになります。

  1. アプリケーションフォルダ内のmodels.pyにモデルを定義
  2. マイグレーションファイルを生成(manage.py makemigrationsの実行)
  3. マイグレーションファイルからSQLを発行してテーブルを生成(manage.py migrateの実行)

次にmodels.pyに実際にモデルを定義する方法について見ていきましょう。

モデルの定義(作成)

models.pyにモデルを定義(モデルの作成)するには、モデル定義を記入する前にdjango.db.modelsをインポートします。

From django.db import models

次に以下のようにモデルの定義を記入していきます。

class Device(models.Model):
    name = models.CharField(max_length=255)
    place = models.CharField(max_length=100)
    type = models.CharField(max_length=100)

Djangoにおいてモデルはdjango.db.models.Modelを継承して定義します。

ここではモデル名がDeviceであり、nameとip_address、typeという3つのフィールドを持ったモデルを定義しました。

モデル作成のルールに基づき、モデル名は大文字で始めます。

モデルはクラスとして定義し、django.db.models.Modelのサブクラスとして動きます。

class Device(models.Model):

モデル内の3つのフィールドはすべてCharFieldという型を設定しています。
CharFieldは文字列を保存するためのフィールドの型です。

フィールドには様々な型(フィールドタイプ)とフィールドオプションが存在します。
フィールドについて詳しくは以下記事をご参照ください。

上記のDeviceモデルは、次のようなSQLを発行してデータベースにテーブルを追加します。(ここではアプリケーション名をmyappとする)

CREATE TABLE myapp_device(
	“id” serial NOT NULL PRIMARY KEY,
	“name” varchar(255) NOT NULL,
	“place” varchar(100) NOT NULL,
	“type” varchar(100) NOT NULL
);

つまりデータベースに登録されるテーブル名がアプリケーション名+モデル名となり、各フィールドがカラムに関連付けられるということです。

IT用語の確認

カラムとは、データベースにおける「列」に相当する属性を指します

Deviceモデルで作成されたmyapp_deviceテーブルを図にすると次のようになります。

Django:モデルで作成されるテーブルの関係

図でモデルとデータベースの関係を覚えるとわかりやすいと思います。

モデルのルールで記載しているように、idフィールド(プライマリーキー)は自動的に追加されるため、モデル定義で記入する必要はないです。
またフィールドのオプションで何も設定していないため、各フィールドにNOT NULL制約がかかっています。

このようにモデルを定義し、そのデータのフィールドとそれらの動作を指定して、データベースへテーブルの追加を行います。

モデルの作成からデータベースへの追加までの流れ

models.pyからデータベースにテーブルを作成するまでの一連の流れを以下に記します。

  1. model.py内にモデル定義を記入する
  2. マイグレーションファイルの生成
  3. マイグレーションファイルの確認
  4. python mage.py migrateの実行
  5. データベースに反映されたかを確認する

model内にモデル定義(クラス定義)を記入する

上述「モデルの定義(作成)」で記したように、アプリケーション内のmodels.pyを編集し、モデルを記入します。

データベースに追加したいテーブルをクラスで定義して、その中にカラムとなるフィールドを1つ以上設定します。

マイグレーションファイルの生成

models.pyの編集が終わりましたら、次にマイグレーションファイルを生成します。
マイグレーションファイルは、Djangoデータベースにmodelの設定変更を知らせるために使います。

またマイグレーションファイル生成前に、念のためsettings.pyのINSTALLED_APPSに該当アプリケーションが追加されているか確認しましょう。
追加されてなければ、必ずアプリケーション名を追加してください。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    #...
    'office54.apps.Office54Config',    # 追加
    #...
]

追加した1行は、office54というアプリケーションフォルダに保存されている、apps.py内のOffice54Configを読み込んでください、という意味です。

マイグレーションファイルを生成するために次のコマンドを実行します。

python manage.py makemigrations

上記コマンドにより、アプリケーションフォルダ内にmigrationsフォルダが作成されます。そしてその中に0001から連番で番号が振られたスクリプトが作成されます。

マイグレーションファイルの確認

「マイグレーションファイルの生成」で作成されたマイグレーションファイルを念のため確認しましょう。

ご自身が想像しているデータベース構造になっているか最終チェックをしてください。

データベースへ反映させる

作成したマイグレーションファイルに問題なければ、次のコマンドを実行してデータベースへ反映させます。

Python manage.py migrate

このコマンドを実行することにより、マイグレーションファイルで記入された変更がデータベースに反映されます。

データベースに反映されたかを確認する

データベースクライアント等で適用結果を確認しましょう。

このような流れでmodels.pyにモデルを定義して、データベースに反映させていきます。

この流れさえわかれば、簡単にデータベースへテーブルの追加ができるということがわかると思います。

まとめ

本記事「【Django】Model(モデル)とは:models.pyの書き方とデータベース連携(テーブル作成)」はいかがでしたか。

データベースの操作(今回で言えばテーブルの追加)が簡単にできるのは、Webフレームワークならではですね。

モデルを通してデータベースの操作ができるようになると、Webアプリケーションの幅が格段に広がります。

ぜひモデルを使いこなして、Webアプリケーション開発を進めてください。