Python入門 Djangoの使い方(その11)モデルを使う。
はじめに
不定期連載のPython入門第25回目です。今回もPythonのWebフレームワーク「Django」を使っていきましょう。PythonのWebフレームワークといえばFlaskやPyramidなどもありますが、最も使われているのはDjangoです。今回はいよいよDjangoのモデル部分を扱っていきたいと思います。
※ところどころ脇道にそれますが、基本的に本家チュートリアルの流れに沿っていきたいと思います。
今回の内容:
- modelクラスを作る。
- migrateファイルを生成する。
- migrateファイルの中身を確認する。
前提条件:
- Pythonバージョン:Python3
- Djangoバージョン:Django1.10.5
- 実行環境:Windows8
- ツール:VisualStudioCommunity2015
アプリケーションを作る(復習)
まず、コマンドプロンプトでプロジェクト内に新しくアプリケーションを追加します。
VisualStudioではソリューションエクスプローラでプロジェクトを右クリックし、
「追加>Django app…」で追加できるのですが、せっかくですので、コマンドで。
python manage.py startapp myApp1
「myApp1」というのが今回作成するアプリケーションの名前です。
ただし、コマンドプロンプトで作成すると、VisualStudio側では認識してくれませんので、
ソリューションエクスプローラでプロジェクトを右クリックし、「追加>Existing Folder..」で、
作成された「myApp1」フォルダを追加しましょう。
モデルを作る
次にこの「myApp1」アプリにモデルを追加します。
アプリフォルダ内に「models.py」というファイルが自動生成されているはずです。
これがモデルクラス用ファイルですね。
# Create your models here.
というメッセージがあるので、その下に以下の様に記述してみました。
class Section(models.Model):
name = models.CharField(max_length=50)
reg_date = models.DateTimeField('reg date')
class User(models.Model):
section = models.ForeignKey(Section, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
age = models.IntegerField(default=20)
これがモデルクラスとなります。
マイグレーション
次にマイグレーションを行っていくわけですが、
その前に、プロジェクトのsettings.pyを編集しておきます。
INSTALLED_APPSに
# Add your apps here to enable them
とありますので、そこに以下の様に追記します。
'myApp1.apps.Myapp1Config',
これでアプリをプロジェクトに認識させることができたので、
次にマイグレーションファイルを以下のコマンドを使って生成します。
python manage.py makemigrations myApp1
※もし上記手順でアプリ認識が出来ていないと、
App 'myApp1' could not be found. Is it in INSTALLED_APPS?
のように表示されてしまいます。
実行完了すると以下の様にメッセージが表示されました。
Migrations for 'myApp1': myApp1\migrations\0001_initial.py - Create model Section - Create model User
マイグレーションの確認
ではmyApp1フォルダ以下のmigrationsフォルダ下に0001_initial.pyが生成されているかを確認しましょう。
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-06-29 00:41
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Section',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50)),
('reg_date', models.DateTimeField(verbose_name='reg date')),
],
),
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('age', models.IntegerField(default=20)),
('section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myApp1.Section')),
],
),
]
ちゃんと出来上がっていました。ただ、これではいまいち分かりづらいですね・・。
そんな時には、以下のコマンドでSQLが見られるようです。
> python manage.py sqlmigrate myApp1 0001
0001がマイグレーションファイルの番号ですね。
今回は以下の表示となりました。
BEGIN;
--
-- Create model Section
--
CREATE TABLE "myApp1_section" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(50) NOT NULL, "reg_date" datetime NOT NULL);
--
-- Create model User
--
CREATE TABLE "myApp1_user" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "na
me" varchar(100) NOT NULL, "age" integer NOT NULL, "section_id" integer NOT NULL
REFERENCES "myApp1_section" ("id"));
CREATE INDEX "myApp1_user_section_id_07db7e4b" ON "myApp1_user" ("section_id");
COMMIT;
どのようなSQLが実行されるのかが分かります。
次回はこのマイグレーションファイルの実行とDBへの反映結果の確認を行います。