4
7

More than 5 years have passed since last update.

Django + MySQLの開発環境をDockerでつくる(その2)

Last updated at Posted at 2019-06-15

その1はこちら

その2 でやりたいこと

  1. Djangoの起動画面を確認する
  2. マイグレーション(DB作成)を行う。
  3. 管理画面からテーブルを確認

Djangoプロジェクトを作成

まずDjangoコンテナに入ります。
その1の「やりたいこと1. の確認」を参照)

$ docker exec -it 4d3 /bin/bash
root@4d3ce7afcc31:/src#

以下コマンドでDjangoプロジェクトを作成します。

django-admin startproject <プロジェクト名>

今回プロジェクト名は「django_project」としました。

root@4d3ce7afcc31:/src# django-admin startproject django_project

プロジェクトフォルダをマウントしてあるので、コンテナ内のコマンド操作で作成したプロジェクトはもちろんホスト側からも確認できます。
image.png
※エディタはVisual Studio Codeを使用してます。

やりたいこと1. の確認

'1. Djangoの起動画面を確認する

cdコマンドで作成したdjango_projectに入ったら、以下コマンド実行

python3 manage.py runserver 0.0.0.0:8000
root@4d3ce7afcc31:/src# cd django_project
root@4d3ce7afcc31:/src/django_project# python3 manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

June 15, 2019 - 09:26:48
Django version 2.1.5, using settings 'django_project.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

ホスト側でブラウザを起動して、「http://localhost:8000」にアクセスしてみましょう。
ロケットが打ち上がっていれば無事完了です。
image.png

モデル(Model)作成

モデルはなんでもいいですが、今回は以下3つのモデルを作成します。(任意で変更・カスタマイズしてください)
・共通のBaseModel
・社員情報のEmployees
・部署情報のDepartments

モデルを作成前に各アプリケーションを作成します。
startproject <プロジェクト名>で作成したプロジェクトにcdコマンドで移動してから行ってください。

django-admin startapp <アプリケーション名>

実際のbaseアプリケーション作成コマンド

root@4d3ce7afcc31:/src# cd django_project/
root@4d3ce7afcc31:/src/django_project# django-admin startapp base

ちゃんとできてますね!
image.png

こんな感じでアプリケーション「employees」と「departments」を作成してください。

root@4d3ce7afcc31:/src/django_project# django-admin startapp employees
root@4d3ce7afcc31:/src/django_project# django-admin startapp departments

モデルは各アプリケーションのmodels.pyに記述していきます。

■共通モデル
※Metaクラスにabstract = Trueを記述しないとマイグレーション実行時にエラーが起こるよ!

base/mdels.py
from django.db import models

# 共通モデル
class BaseModel(models.Model):
    class Meta(object):
        abstract = True
        ordering = ('pk', )

    created_date = models.DateField(auto_now_add=True)
    updated_date = models.DateField(auto_now=True)

■社員モデル

employees/models.py
from django.db import models
from base.models import BaseModel
from departments.models import Department

# Create your models here.
class Employees(BaseModel):
    full_name = models.CharField(null=False, blank=True, max_length=100)
    first_name = models.CharField(null=False, blank=True, max_length=100)
    last_name = models.CharField(null=False, blank=True, max_length=100)
    birthday = models.DateField()
    age = models.IntegerField()
    email = models.EmailField(max_length=256)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)

■部署モデル

departments/models.py
from django.db import models
from base.models import BaseModel

# Create your models here.
class Department(BaseModel):
    code = models.CharField(null=False, blank=True, max_length=3)
    name = models.CharField(null=False, blank=True, max_length=100)

マイグレーションファイル作成

settings.pyに、作成したアプリケーション3つを追記し、DB接続情報を修正します。

settings.py
.
..
...
INSTALLED_APPS = [
    .
    ..
    ...
    'base',
    'departments',
    'employees',
]
...
..
.
DATABASES = {
    'default': {
        'ENGINE' : 'django.db.backends.mysql'
        , 'NAME' : 'db_maria'#←.envの<MYSQL_DATABASE>
        , 'USER' : 'user'#←.envの<MYSQL_USER>
        , 'PASSWORD' : 'user'#←.envの<MYSQL_PASSWORD>
        , 'HOST' : '172.20.0.3' #←docker-compose.yml内mysqlに指定したIPAddress
        , 'PORT' : '3306'
        ,
    }
}
...
..
.

マイグレーション用にマイグレーションファイルを作成します。
※こっちも同様にstartproject <プロジェクト名>で作成したプロジェクトにcdコマンドで移動してから行ってください。

python3 manage.py makemigrations

以下、実行結果。
migrationsフォルダの下にマイグレーションファイルが作成されます。

root@4d3ce7afcc31:/src/django_project# python3 manage.py makemigrations
Migrations for 'departments':
  departments/migrations/0001_initial.py
    - Create model Department
Migrations for 'employees':
  employees/migrations/0001_initial.py
    - Create model Employees

やりたいこと2. の確認

'2. マイグレーション(DB作成)を行う。

※こっちも同様にstartproject <プロジェクト名>で作成したプロジェクトに(以下略

python3 manage.py migrate

以下、実際の実行結果

root@4d3ce7afcc31:/src/django_project# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
  Applying departments.0001_initial... OK
  Applying employees.0001_initial... OK

エラーが出ずに、base以外の「employees」と「departments」にOKが出てれば完了です。

エラーが出た場合は、mysqlコンテナが起動しているか、settings.pyに記述したDB接続情報は正しいか、確認してみてください。
docker psで現在起動中のコンテナが確認できます。そこにmysqlコンテナが出てきていない場合は起動してないので、docker start <CONTAINER ID> または <NAMES>で起動して再度マイグレーションしてください。

やりたいこと3. の確認

'3. 管理画面からテーブルを確認

管理画面で確認できるようアプリケーションを登録します。
base以外の「employees」と「departments」のadmin.pyを修正します。
ちなみに、from .models import モデル名from models import モデル名にしてもコード補完で対象のモデルがちゃんと出てきますが、Djangoサーバー起動時にエラーになるのでお気をつけて∑(゚Д゚)

employees/admin.py
from django.contrib import admin
from .models import Employees

# Register your models here.
admin.site.register(Employees)
departments/admin.py
from django.contrib import admin
from .models import Department

# Register your models here.
admin.site.register(Department)

つぎは管理者を登録します。
※こっちも同様にstartproject <プロジェクト名>(以下略

python3 manage.py createsuperuser

実際の実行例

root@4d3ce7afcc31:/src/django_project# python3 manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

パスワードが短すぎると赤文字で警告が出ますが、「y」で進めてOKです。

最後にDjangoサーバーを起動して、管理画面にアクセスします。
http://localhost:8000/admin

createsuperuserで登録した管理者のユーザー名とパスワードでログイン!
ちゃんと「employees」と「departments」も確認できますね!
image.png

image.png

以上

管理画面を日本語化する

settings.pyを以下のように修正すると、管理画面を日本語化できます。
※管理画面を開いている場合は、settings.py修正後にログアウトして再度ログインしてください。

settings.py
...
..
.
# こっちはコメントアウト
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'

# 管理画面が日本語化される。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
...
..
.

英語の管理画面が。
image.png



日本語の管理画面に!
image.png

createsuperuser実行前にこの記述に変えちゃうとcreatesuperuser実行時にエラーが発生しちゃうのでお気をつけて。

settings.pyはそのままでcreatesuperuserしたいんじゃ!!!て方用(コピペでいけるはず)。

export PYTHONIOENCODING="UTF-8"; python3 manage.py createsuperuser
4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7