カンバンボード アプリケーション開発(2)
マイグレーション
モデルの定義が完成したので次は、データベースのテーブル作成方法を見ていきましょう。
Djangoでは以下の流れで、データベースのスキーマに変更を加えていきます。
- モデルの定義を編集
- 1の変更を元にマイグレーションファイルを作成
- マイグレーションを実行
マイグレーションファイルを作成するには、manage.py makemigrationsコマンドを使います。makemigrationsコマンドは、INSTALLED_APPSに登録されているアプリケーションのモデルの変更を検知し、テーブル作成やカラム変更に必要なマイグレーションファイルを作成します。ここではTicketモデルが新規に作成されるので、CREATE文を実行するマイグレーションファイルが作成されます。
(env) $ python manage.py makemigrations
Migrations for 'board':
kanban/board/migrations/0001_initial.py
- Create model Ticket
次にmanage.py migrateコマンドでマイグレーションを実行して、データベースのスキーマを変更します。migrateコマンドは、makemigrationsと同様にINSTALLED_APPSに登録されているアプリケーションのマイグレーションファイルを参照し、データベースに対する操作を行います。ここでは先ほど作成したboardアプリケーションの0001_initial.pyが実行されます。
(env) $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, board, contenttypes, sessions Running migrations: Applying board.0001_initial... OK
テーブルの作成が完了したので確認してみましょう。sqlite3コマンドでもよいですが、今回はmanage.py dbshellコマンドを使います。dbshellはプロジェクトのデータベース設定を元に、該当するデータベースのシェルを起動します。
(env) $ python manage.py dbshell
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
sqlite> .schema board_ticket
CREATE TABLE "board_ticket" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(100) NOT NULL, "description" text NOT NULL, "status" smallint NOT NULL, "start" date NULL, "end" date NULL, "assignee_id" integer NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "board_ticket_assignee_id_575ed467" ON "board_ticket" ("assignee_id");
board_ticketテーブルとそのインデックスを作成するためのCREATE文が実行されたことを確認できました。
管理サイトへの登録
このTicketモデルを管理サイトからCRUD編集できるように設定しましょう。kanban/board/admin.pyを次のように編集します。
from django.contrib import admin from .models import Ticket admin.site.register(Ticket)
これだけで登録は完了です。開発サーバを起動して、管理サイトにログインしてみましょう。
(env) $ python manage.py runserver
http://127.0.0.1:8000/adminにアクセスすると、新しくboardアプリケーション用の項目が追加されていることがわかります。
ここからticketを新規に作成してみましょう。
このように管理サイトでは、データのCRUD操作を簡単に行えます。アプリケーションの要件によっては、管理機能を自分で実装せずにDjangoの管理サイトで十分な場合も多いです。Djangoの大きな魅力のひとつですので、ぜひ活用してください。
