概要
Djangoのマイグレーションでテーブルを生成すると、テーブル名は、アプリケーション名とスネークケース化されたモデル名がアンダースコアで繋がれた名前になる。
たとえばアプリケーション名がmy_app、モデル名がMyModelのときのテーブル名はmy_app_mymodelとなる(モデル・テーブル等の名前)。
これが次のような点で気持ち悪い。
- 単数形のモデル名のままでテーブル名も単数形になる
- モデル名がスネークケースにならず区切りがなくなる
この自動で付与されるテーブル名を変更する方法があることを知った(参考サイト:Django モデルのメタクラス)。
クラス定義にclass Metaを加える
アプリケーションとモデルを以下の設定とする。
| アプリケーション名 | warehouse |
| モデルクラス名 | StockItem、ShippingOrder |
これでマイグレーションを実行すると、テーブル名はwarehouse_stockitem、warehose_shippingorderのようになる。これをstock_items、shipping_ordersのように変更したい場合、クラス定義に以下のように追記する。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from django.db import models class StockItem(models.Model): name = models.CharField(max_length=20) number = models.IntegerField(default=0) class Meta: db_table='stock_items' class ShippingOrder(models.Model): stock_item = models.ForeignKey(MyModel1, on_delete=models.CASCADE) name = models.CharField(max_length=20) number = models.IntegerField(default=0) class Meta: db_table='shipping_orders' |
マイグレーションを実行。
|
1 2 3 4 5 6 7 8 9 10 |
$ python3 manage.py makemigrations Migrations for 'warehouse': my_app/migrations/0001_initial.py - Create model StockItem - Create model ShippingOrder $ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, my_app, warehouse, sessions Running migrations: Applying my_app.0001_initial... OK |
テーブル確認。
|
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 | | questions | | shipping_orders | | stock_items | +----------------------------+ 14 rows in set (0.00 sec) |