概要
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) |