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…」で追加できるのですが、せっかくですので、コマンドで。
1 | python manage.py startapp myApp1 |
「myApp1」というのが今回作成するアプリケーションの名前です。
ただし、コマンドプロンプトで作成すると、VisualStudio側では認識してくれませんので、
ソリューションエクスプローラでプロジェクトを右クリックし、「追加>Existing Folder..」で、
作成された「myApp1」フォルダを追加しましょう。
モデルを作る
次にこの「myApp1」アプリにモデルを追加します。
アプリフォルダ内に「models.py」というファイルが自動生成されているはずです。
これがモデルクラス用ファイルですね。
1 | # Create your models here. |
というメッセージがあるので、その下に以下の様に記述してみました。
1 2 3 4 5 6 7 8 | 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に
1 | # Add your apps here to enable them |
とありますので、そこに以下の様に追記します。
1 | 'myApp1.apps.Myapp1Config' , |
これでアプリをプロジェクトに認識させることができたので、
次にマイグレーションファイルを以下のコマンドを使って生成します。
1 | python manage.py makemigrations myApp1 |
※もし上記手順でアプリ認識が出来ていないと、
1 | App 'myApp1' could not be found. Is it in INSTALLED_APPS? |
のように表示されてしまいます。
実行完了すると以下の様にメッセージが表示されました。
1 2 3 4 | Migrations for 'myApp1' : myApp1\migrations\0001_initial.py - Create model Section - Create model User |
マイグレーションの確認
ではmyApp1フォルダ以下のmigrationsフォルダ下に0001_initial.pyが生成されているかを確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # -*- 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が見られるようです。
1 | > python manage.py sqlmigrate myApp1 0001 |
0001がマイグレーションファイルの番号ですね。
今回は以下の表示となりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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への反映結果の確認を行います。