Djangoをやってみよう。 その5-Modelの追加-
その4のつづき。
前回追加した、warshipアプリにモデルを追加して
データベースを触ってみようと思う。
Modelの作成
warship/models.pyを開いて、ここにクラスの定義を記述する。
from django.db import models # Create your models here. class ShipClass(models.Model): name = models.CharField(max_length=30) class Warship(models.Model): ship_class = models.ForeignKey(ShipClass, on_delete=models.CASCADE) name = models.CharField(max_length=30)
サンプルでは艦種クラスと艦船クラスを作成した。
艦種は「駆逐艦」とか「戦艦」とかそんな種別を表し、艦船は種別と名前を持つ、そんなイメージ。
ここでのモデルは当然、DBから取得した値を格納するためのものであるので、
クラスのメンバもDBに関するものを定義することになる。
ここで登場したものでは、models.CharFieldクラスとForeignKeyクラスがある。
CharFieldはいわゆる、Varchar型、Char型なんかを格納するためのクラス。
ForeignKeyはそのまま、外部キーによる結合を想定している場合に使用するクラスとなっている。
引数に結合するクラスと、削除時にカスケードするかなどの定義を設定できる。
これら以外にも、整数型のためのIntegerFieldクラスだとか、BooleanFieldクラスなんかも当然あるが、
今回は割愛する。
モデルを定義したら、テーブルを作成する。
Djangoはモデルに応じて自動的にテーブルを作ってくれるので楽ちんである。
そのためのコマンドを実行する。
python manage.py makemigrations warship
実行するとアプリケーション内のモデルの変更点を認識し、
適切なコマンドを作ってくれる。
Migrations for 'warship': warship/migrations/0001_initial.py: - Create model ShipClass - Create model Warship
今回は初めてのモデル作成だったのでCreate Tableのコマンドが作られたようだ。
どんなSQLになるかについては、またまたコマンドで確認できる。
python manage.py sqlmigrate warship 0001
BEGIN; -- -- Create model ShipClass -- CREATE TABLE "warship_shipclass" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL); -- -- Create model Warship -- CREATE TABLE "warship_warship" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL, "ship_class_id" integer NOT NULL REFERENCES "warship_shipclass" ("id")); CREATE INDEX "warship_warship_ab7d680f" ON "warship_warship" ("ship_class_id"); COMMIT;
とまぁ、こんなSQLが実行されるらしい。
中身がわかったところで、テーブル作成を行ってみる。
DBを直接触る必要がなく、Djangoのコマンドで行える。
python manage.py migrate warship 0001
実行後、こんなメッセージがでれば成功。
Operations to perform: Target specific migration: 0001_initial, from warship Running migrations: Applying warship.0001_initial... OK
これでモデルとDBができた。
データ登録、検索ができるか、などについては、次回に続く。