5.

Djangoにおけるテーブル名 = アプリケーション名 + モデル名の設定変更

編集
この記事の要点
  • Django ORM のデフォルトテーブル名は 「アプリ名_モデル名」
  • 例: アプリ users + モデル Profile → テーブル users_profile
  • モデル名は小文字化される
  • カスタム指定: class Meta: db_table = "custom_name"
  • app_label で別の app に所属させることも可能

 

デフォルトのテーブル名規則

# プロジェクト構造
myproject/
├── manage.py
└── apps/
    └── users/           # アプリ名: "users"
        ├── apps.py      # name = "users"
        └── models.py    # Profile モデル

# models.py
class Profile(models.Model):
    name = models.CharField(max_length=100)

# 生成される DB テーブル名:
# → "users_profile" (アプリ名_モデル名)

命名規則の詳細

アプリ名モデル名テーブル名
usersProfileusers_profile
usersUserSettingsusers_usersettings (小文字化、_ なし)
blogBlogPostblog_blogpost
shopOrdershop_order
auth (Django 標準)Userauth_user

注意: CamelCase は小文字化されるが、単語間に _ は入らない:

class UserSettings(models.Model):
    ...

# → users_usersettings (× users_user_settings)

カスタムテーブル名の指定

class Profile(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        db_table = "custom_profile"  # ← 任意のテーブル名

# → "custom_profile" テーブルが作成される

既存 DB との連携

# 既存の "user_profiles" テーブルを使いたい
class UserProfile(models.Model):
    name = models.CharField(max_length=100, db_column="user_name")  # カラム名指定
    email = models.EmailField(db_column="email_address")

    class Meta:
        db_table = "user_profiles"
        managed = False  # ← Django で migrate しない(テーブル既存)

app_label の指定

# アプリ "shop" 内で他アプリ "blog" のテーブル名を使いたい
# 通常は無理だが、app_label で明示可能

# apps/shop/models.py
class Article(models.Model):
    title = models.CharField(max_length=100)

    class Meta:
        app_label = "blog"
        db_table = "blog_article"  # blog_article として作成

# 注: 通常はこれを避け、proper な location にモデルを置く

Django 標準アプリのテーブル名

アプリモデルテーブル名
authUserauth_user
authGroupauth_group
authPermissionauth_permission
contenttypesContentTypedjango_content_type
sessionsSessiondjango_session
adminLogEntrydjango_admin_log

マイグレーション後にテーブル名を変更

# 既に "users_profile" として作成済み
# "custom_profile" に変更したい

# 1. モデルに db_table を追加
class Profile(models.Model):
    ...
    class Meta:
        db_table = "custom_profile"

# 2. makemigrations
$ python manage.py makemigrations
Migrations for 'users':
  users/migrations/0002_alter_profile_options.py
    - Change Meta options on profile

# 3. migrate
$ python manage.py migrate
# → RENAME TABLE users_profile TO custom_profile が実行される

現在のテーブル名を確認

# Python シェルから
$ python manage.py shell
>>> from users.models import Profile
>>> Profile._meta.db_table
'users_profile'

# SQL クエリで
>>> from django.db import connection
>>> connection.introspection.table_names()
['auth_group', 'auth_user', 'users_profile', ...]

# 個別モデルの SQL を見る
>>> from django.db import connection
>>> print(connection.queries[-1])  # 直前のクエリ

# manage.py sqlmigrate でマイグレーション SQL を表示
$ python manage.py sqlmigrate users 0001
CREATE TABLE "users_profile" (...);

命名衝突対策

異なるアプリで同名モデルがあると、テーブル名で区別:

# blog/models.py
class Post(models.Model):
    title = models.CharField(max_length=100)
# → blog_post

# news/models.py
class Post(models.Model):
    title = models.CharField(max_length=100)
# → news_post

# 衝突しない(アプリ名で prefix される)

# ForeignKey で参照する場合は "app.Model" 形式
class Comment(models.Model):
    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE)

注意点

  • 名前変更には migrate 必須: db_table 変更 → makemigrations → migrate
  • 本番でのリネームは慎重に: 大規模テーブルは ALTER TABLE が長時間ロック
  • managed=False: 既存 DB の場合、Django の migrate 対象から外す
  • 命名規則の混在: snake_case と CamelCase が混ざらないように統一
  • db_column 指定: カラム名も同様にカスタマイズ可能

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Model の定義方法
  2. マイグレーションファイルの作成
  3. テーブル定義の確認
  4. テーブルの作成
  5. テーブル名 = アプリケーション名 + モデル名の設定変更
  6. モデルの中身を確認