その2 でやりたいこと
- Djangoの起動画面を確認する
- マイグレーション(DB作成)を行う。
- 管理画面からテーブルを確認
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
プロジェクトフォルダをマウントしてあるので、コンテナ内のコマンド操作で作成したプロジェクトはもちろんホスト側からも確認できます。
※エディタは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」にアクセスしてみましょう。
ロケットが打ち上がっていれば無事完了です。
モデル(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
こんな感じでアプリケーション「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
を記述しないとマイグレーション実行時にエラーが起こるよ!
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)
■社員モデル
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)
■部署モデル
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接続情報を修正します。
.
..
...
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サーバー起動時にエラーになるのでお気をつけて∑(゚Д゚)
from django.contrib import admin
from .models import Employees
# Register your models here.
admin.site.register(Employees)
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」も確認できますね!
以上
管理画面を日本語化する
settings.pyを以下のように修正すると、管理画面を日本語化できます。
※管理画面を開いている場合は、settings.py修正後にログアウトして再度ログインしてください。
...
..
.
# こっちはコメントアウト
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
# 管理画面が日本語化される。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
...
..
.
createsuperuser
実行前にこの記述に変えちゃうとcreatesuperuser
実行時にエラーが発生しちゃうのでお気をつけて。
settings.pyはそのままでcreatesuperuser
したいんじゃ!!!て方用(コピペでいけるはず)。
export PYTHONIOENCODING="UTF-8"; python3 manage.py createsuperuser