目的
Djangoでアプリケーションとモデルを作成し、マイグレーションした場合の、テーブル名、フィールド名などを確認。アプリケーション名をmy_app
、モデルクラス名をMyModel1
、MyModel2
とする。
手順
アプリケーション作成
アプリケーション名はスネークケース(my_app
)
1 |
$ python3 manage.py startapp my_app |
アプリケーション構成クラス名の確認
1 2 3 4 5 6 |
from django.apps import AppConfig class MyAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'my_app' |
アプリケーション名がスネークケースの場合、アプリケーション構成クラス名はアッパーキャメルケースになり、Config
が付加される。
my_app
→ MyAppConfig
アプリケーション登録
settings.py
のINSTALL_APPS
にアプリケーション構成クラスを追加。ここではアプリケーション構成クラスを追加している。
1 2 3 4 5 6 7 8 9 |
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'my_app.apps.MyAppConfig', ] |
モデル定義
my_apps/models.py
ファイルで2つのモデルクラスMyModel1
、MyModel2
を定義。MyModel2
にはMyModel1
への参照キーを設定する。
1 2 3 4 5 6 7 8 |
from django.db import models class MyModel1(models.Model): name = models.CharField(max_length=20) class MyModel2(models.Model): my_model1 = models.ForeignKey(MyModel1, on_delete=models.CASCADE) name = models.CharField(max_length=20) |
マイグレーションファイル作成
1 2 3 4 5 |
$ python3 manage.py makemigrations my_app Migrations for 'my_app': my_app/migrations/0001_initial.py - Create model MyModel1 - Create model MyModel2 |
マイグレーション
マイグレーションを実行してテーブルを生成させる。
1 2 3 4 5 |
$ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, my_app, sessions Running migrations: Applying my_app.0001_initial... OK |
テーブル確認
テーブル名は’アプリケーション名_小文字化されたモデル名
‘となる。キャメルケースのモデル名をスネークケースにはしてくれない。
my_app
+ MyModel1
→ my_app_mymodel1
my_app
+ MyModel2
→ my_app_mymodel2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> show tables; +----------------------------+ | Tables_in_django_tutorial | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | choices | | django_admin_log | | django_content_type | | django_migrations | | django_session | | my_app_mymodel1 | | my_app_mymodel2 | | questions | +----------------------------+ 14 rows in set (0.00 sec) |
テーブル構造を確認。
MyModel2
の外部キーは、’参照先モデル名(スネークケース)_id
‘となる。この場合は参照先がMyModel1なので、
MyModel1
→ my_model1_id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
mysql> describe my_app_mymodel1; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.01 sec) mysql> describe my_app_mymodel2; +--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | my_model1_id | bigint | NO | MUL | NULL | | +--------------+-------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) |
まとめ
これを表で整理すると以下のようになる。
my_app |
||
アプリケーション構成クラス名(生成) | MyAppConfig |
|
モデルクラス名(定義) | MyModel1 |
MyModel2 |
テーブル名(マイグレーション) | my_app_mymodel1 |
my_app_mymodel2 |
外部キー名(マイグレーション) | my_model1_id |
これを何とか図にすると、以下のようになる。
1 2 3 4 5 6 7 |
アプリケーション:my_app → MyAppConfig | └──┐ ↓ モデルクラス:MyModel1 ─→ テーブル:my_app_mymodel1 ─┐ ↓ モデルクラス:MyModel2 ─→ テーブル:my_app_mymodel2 ──→ 外部キー:my_model1_id |
まとめると以下のようになる。
- アプリケーション名:スネークケース
→アプリケーション構成クラス名:アッパーキャメルケース - モデルクラス名:アッパーキャメルケース
- テーブル名:
アプリケーション名_小文字化されたアプリケーション構成クラス名
- 外部キー名:
参照先のモデル名(スネークケース)_id