Help us understand the problem. What is going on with this article?

Djangoを始めよう! 〜チュートリアル②〜

More than 3 years have passed since last update.

概要

前回の続きです。
今回のチュートリアルでは以下の項目を実施したいと思います。

  • データベースのセットアップ
  • モデルの作成
  • Djangoが提供してくれる、管理サイトの活用

データベースの設定

データベースの設定は、mysite/settings.pyで行います。

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

上記がDBの設定箇所となります。
今回はMySQLを想定していますので、ローカル環境でMySQLのDBサーバを立ち上げて、接続してみます。

以下の様な設定となります。

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',  # 適当です
        'USER': 'dbuser',  # 適当です
        'PASSWORD': 'FIXME',  # 適当です
        'HOST': 'FIXME',  # 適当です (ローカルホストなら空でも可)
        'PORT': 'FIXME',  # 適当です (デフォルトポートなら空でも可)
    }
}

次に、PythonでMySQLを利用する為のモジュールをpipでインストールします。

$ pip install PyMySQL

最後に、DjangoのプロジェクトにMySQLを利用する事を宣言します。
デフォルトではsqliteになっているので、manage.pyに以下の記述を行いましょう。

mysite/manage.py
import pymysql
pymysql.install_as_MySQLdb()

ここまででrunserverします。

$ python manage.py runserver

以下の結果がでれば、正常に接続できています。
(migrate系のエラーが全て消えている事も確認して下さい。)

[t.fujimoto@tfujimoto-MacBook-Air:mysite]$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
October 12, 2016 - 12:51:50
Django version 1.10.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

settings.pyの中身

データベースの設定など、プロジェクト全体の設定を行う、settings.pyですが、様々な重要な設定が書かれています。

中でも、INSTALLED_APPSはかなり重要です。
INSTALLED_APPSはこのプロジェクトのDjangoインスタンスの中で有効化されているすべてのDjangoアプリケーションの名前を保持しています。

アプリは複数のプロジェクトによって使用される事ができますし、また、他の開発者が作ったアプリを導入する事ができます。

初期では以下の様な設定になっています。

mysite/mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

各アプリは以下の様な役割を担います。

  • django.contrib.admin
    • 管理サイトアプリ
  • django.contrib.auth
    • 認証アプリ
  • django.contrib.contenttypes
    • コンテンツタイプフレームワーク
  • django.contrib.sessions
    • セッションフレームワーク
  • django.contrib.messages
    • メッセージフレームワーク
  • django.contrib.staticfiles
    • 静的ファイルの管理フレームワーク

Webアプリケーションとして、よく使われるアプリがデフォルトで付いてくるイメージです。

上記のアプリケーションたちは、データベースを使います。
その為に、初期設定として、テーブルを作成しなければなりません。

下記のコマンドで、migrateファイルを実行してくれます。

$ python manage.py migrate

モデルを作成する

モデルは、手持ちのデータに対する唯一の決定的なソースです。
モデルには、自分が格納したいデータにとって、必要なフィールドと、そのデータの挙動を記載します。

今回のチュートリアルでは投票アプリを制作していますので、
投票項目が格納されている、Questionテーブル(モデル)と、Questionの投票項目のテキストなどを格納するChoiceテーブル(モデル)を作成します。

以下の様になります。

mysite/polls/models.py
from django.db import models

# Create your models here.


class Question(models.Model):
    quesion_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

モデルを有効にする

モデルは作成できましたが、まだデータベースには反映されていません。

  • CREATE TABLE
  • QuestionやChoiceオブジェクトにPythonからアクセスする為のデータベースAIPの作成

上記を可能にする為の設定を行います。

まずは、Djangoプロジェクトにpollsアプリケーションを利用する事を明記しなければなりません。

先ほど紹介した、mysite/settings.pyのINSTALLED_APPSを以下の記述に変更します。

mysite/mysite/settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

上記の追加ができたら、マイグレーションスクリプトを作成します。
以下のコマンドでマイグレーションスクリプトが作成できます。

$ python manage.py makemigrations polls

makemigrationsを実行することで、Djangoのモデルに変更があった事を伝え、そして変更をマイグレーションの形で保存できます。

マイグレーションとは、Djangoがモデルの変更をディスク上のファイルに保存する方法です。
作成されたマイグレーションは各アプリケーションのmigrationsディレクトリに番号で格納されます。

今回作成した、マイグレーションスクリプトは以下の様になります。

# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-10-12 13:20
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='Choice',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('choice_text', models.CharField(max_length=200)),
                ('votes', models.IntegerField(default=0)),
            ],
        ),
        migrations.CreateModel(
            name='Question',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('quesion_text', models.CharField(max_length=200)),
                ('pub_date', models.DateTimeField(verbose_name='date published')),
            ],
        ),
        migrations.AddField(
            model_name='choice',
            name='question',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'),
        ),
    ]

マイグレーションスクリプトが作成できたら、あとは実行するだけです。

$ python manage.py migrate

上記で、まだ実行されていないマイグレーションスクリプトを実行してくれます。

また、マイグレーションスクリプトを指定して、どの様なSQLが発行されるかを確認する事も可能です。

$ python manage.py sqlmigrate polls 0001

以下で、0001のファイルであれば、CRATE文などが確認できると思います。

モデル作成からマイグレーションスクリプト実行までの流れ

モデル作成(各アプリのmodels.py)

プロジェクトにアプリケーション読み込み(mysiteのsettings.pyのINSTALLED_APP)

モデルを元にマイグレーションスクリプトを作成(makemigrations)

マイグレーションスクリプトを実行(migrate)

Djangoの設計哲学

Djangoアプリケーションは「プラガブル」です。
アプリケーションは特定のDjangoプロジェクトに結びついていないので、アプリケーションを複数のプロジェクトで利用したり、単体で配布したりできます。

Django Admin

Djangoでは管理サイトがデフォルトで付いてきます。
まずは、管理サイトにログインできるスーパーユーザーを作成します。

$ python manage.py createsuperuser

対話形式でユーザーIDやパスワードを設定していって下さい。

スーパーユーザーができたら、実際にログインしてみます。

ブラウザを起動して、ローカルドメインのlocalhost/admin/にアクセスします。

ログインに成功すれば、以下の様な管理画面が表示されます。

スクリーンショット 2016-10-12 23.16.56.png

Pollsアプリをadmin上で編集できる様に設定する。

何も設定していなければ,Pollsアプリはadminでは表示されていません。
Pollsアプリもadminから操作できる様に修正します。

pollsのadmin.pyを以下の様に修正します。

polls/admin.py
from django.contrib import admin

# Register your models here.

from .models import Question

admin.site.register(Question)

これで再度開発サーバをリロードすると、

スクリーンショット 2016-10-12 23.21.20.png

無事、POLLSが追加されている事がわかると思います。

これで、GUI操作でPOLLSが修正できる様になりました。

まとめ

今回は、モデルの作成、マイグレーションスクリプトの実行、管理画面の見方について説明しました。

地味な回にはなりましたが、次回以降のビュー操作と密接に絡む重要な回でした。

次回は、自作のビューの作成やテンプレートファイルの使い方について解説していきたいと思います。

GitHub

シリーズ

tfrcm
React / ReactNative / Go / TypeScript / AWS / Docker / k8s
https://gemcook.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした