Tips

Python入門 Djangoの使い方(その11)モデルを作る。
2017.06.29

Python入門 Djangoの使い方(その11)モデルを作る。

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

新連載はじまりました!独学で学ぶPython基礎 連載リンク

独学で学ぶ-Pythonプログラミング 連載

Recent News

Recent Tips

Tag Search