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

[その1はこちら](https://qiita.com/Butterthon/items/594168049d930dcad5ae)
  
# その2 でやりたいこと
1. Djangoの起動画面を確認する
2. マイグレーション(DB作成)を行う。
3. 管理画面からテーブルを確認
  
# Djangoプロジェクトを作成
まずDjangoコンテナに入ります。
（[その1の「やりたいこと1. の確認」を参照）](https://qiita.com/Butterthon/items/594168049d930dcad5ae)
  
```
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/e5abd781-d6a0-3e5b-ffa2-bdeafec6057c.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/159dcc2a-b2e9-0c98-d4dd-cede3e205817.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/46858023-3655-49a0-00b4-3c1c0aefcc05.png)
  
こんな感じでアプリケーション「employees」と「departments」を作成してください。

```
root@4d3ce7afcc31:/src/django_project# django-admin startapp employees
root@4d3ce7afcc31:/src/django_project# django-admin startapp departments
```
  
モデルは各アプリケーションのmodels.pyに記述していきます。

***■共通モデル***
<font color="red">※Metaクラスに`abstract = True`を記述しないとマイグレーション実行時にエラーが起こるよ！</font>

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/8d0e6504-8fd8-5e71-151c-a9c52fe7d67a.png)
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/bc9af281-33c3-bf97-eb25-3e45f2b0bdf6.png)

以上
  
# 管理画面を日本語化する
settings.pyを以下のように修正すると、管理画面を日本語化できます。
※管理画面を開いている場合は、settings.py修正後にログアウトして再度ログインしてください。
  
```settings.py
...
..
.
# こっちはコメントアウト
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'

# 管理画面が日本語化される。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
...
..
.
```
  
英語の管理画面が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/5345c889-f2f5-e0cd-7831-8142256ecfa0.png)
↓
↓
↓
日本語の管理画面に！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/8048d520-334d-7458-f057-4a83fac97704.png)


`createsuperuser`実行前にこの記述に変えちゃうと`createsuperuser`実行時にエラーが発生しちゃうのでお気をつけて。
  
settings.pyはそのままで`createsuperuser`したいんじゃ！！！て方用（コピペでいけるはず）。

```
export PYTHONIOENCODING="UTF-8"; python3 manage.py createsuperuser
```