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への反映結果の確認を行います。