如何控制 Django migrate 创建的表名

Posted

技术标签:

【中文标题】如何控制 Django migrate 创建的表名【英文标题】:How to control table names created by Django migrate 【发布时间】:2015-12-15 22:36:54 【问题描述】:

上下文: Django 1.7; mysql 5.6.23; 在 AWS 上运行(不确定确切的 Linux 操作系统版本)

我有一个 Django 1.7 项目。当我进行初始迁移以在我的 Windows 笔记本电脑上本地构建我的数据库时,我会得到以我的应用程序名称为前缀的表,如下所示:

myapp_person(对于 Django class Person(models.Model)

myapp_personmap(对于 Django class PersonMap(models.Model)

当我进行迁移并迁移到 AWS Linux 服务器时,这些表的名称如下:

MyApp_person

MyApp_personmap

请注意 app-name 前缀的意外 CamelCase 和其余表名的预期小写。

我的问题:

    什么控制着表的 appname 前缀(例如“myapp_person”中的“myapp_”)? 如何让迁移在 AWS 上使用全小写,就像在我的 Windows 笔记本电脑上本地一样?

【问题讨论】:

Linux 文件系统区分大小写,因此您应该考虑将文件夹从 Myapp 重命名为 myapp 【参考方案1】:

您可以从Model Meta Options 使用db_table

class MyModel(models.Model):

...

class Meta:
    db_table = 'my_custom_table_name'

【讨论】:

从您提供的文档链接中,确实说“Django 自动从您的模型类和包含它的应用程序的名称中派生数据库表的名称。”但它并没有说明我是否/如何控制结果名称的大小写。你知道这是否可能,这样我就不必为我定义的每个类都这样做? 在元选项中,您也可以根据需要更改 app_label。是的,当您定义模型并进行迁移时,表的名称将在 Meta 中定义为 db_table 并且您在每个模型中都需要它 感谢您的帮助@Gocht!【参考方案2】:

要使用您自己的自定义表名,您需要在模型Meta 选项中定义db_table 参数。

来自 table names: 上的 Django 文档

要覆盖数据库表名,请使用db_table 参数 元类。

Query-1:应用名称前缀由什么控制?

如果您没有在模型的 Meta 类中定义 db_table 选项,那么 Django 会使用 app label 和模型的类名自动派生名称。

来自official docs:

Django 自动从 您的模型类和包含它的应用程序的名称。一个模型 数据库表名由加入模型的“app label”构成 – 您在 manage.py startapp 中使用的名称 – 模型的类名, 它们之间有一个下划线。

例如:

如果您有一个由manage.py startapp xyz 创建的应用程序xyz,则定义为类Abc 的模型将有一个名为xyz_abc 的数据库表。

Query-2:使用自定义表名创建表

如果要使用自定义表名,则需要在模型Meta 中使用db_table 选项。

在这里,您可以明确定义小写的 db 表名。

class Person(models.Model):

    class Meta:
        db_table = '"myapp_person"' # define your custom name

class PersonMap(models.Model):

    class Meta:
        db_table = '"myapp_personmap"' # define your custom name

【讨论】:

感谢您详细说明 Rahul! 很具体的解释。 是否有类似的选项来改变 django 给出的列名作为 column_id_id

以上是关于如何控制 Django migrate 创建的表名的主要内容,如果未能解决你的问题,请参考以下文章

9.Django里的数据同步migrate命令

django重新创建数据库和表

Django(21)migrate报错的解决方案

Django 如何在第一次迁移时制作与用户、身份验证、组、会话等相关的表?

Django 基础 之ORM多表操作

Django Migration (makemigrations) 应该与创建模型分开提交吗?