ひこぽんのーと

覚書と雑記です。

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ができた。
データ登録、検索ができるか、などについては、次回に続く。