如何删除 Django 模型的表前缀?

Posted

技术标签:

【中文标题】如何删除 Django 模型的表前缀?【英文标题】:How to remove the prefix of a table for a Django model? 【发布时间】:2012-04-08 15:08:24 【问题描述】:

我创建了一个名为 Bussinesses 的新 Django 应用程序(不是项目),然后将以下类添加到 models.py

class Bussinesses(models.Model):
    business_email = models.EmailField()
    password = models.CharField(max_length=20)
    contact_first_name = models.CharField(max_length=30)
    contact_last_name = models.CharField(max_length=30)

如果我直接使用Bussinesses,Django会访问数据库中的“bussinesses_bussinesses”表,这个表显然不存在。

由于“业务”表也被其他APP使用,所以不能重命名。 我想知道如何在不使用表前缀的情况下使用 Django 模型,也不想直接使用原始数据库 API。

【问题讨论】:

【参考方案1】:

只需使用model meta options。

class Bussinesses(models.Model):
    business_email = models.EmailField()
    password = models.CharField(max_length=20)
    contact_first_name = models.CharField(max_length=30)
    contact_last_name = models.CharField(max_length=30)

    class Meta:
        db_table = "bussinesses"

BTW businesses 拼写错误。由于您要指定表的名称,因此您不必为模型提供与表相同的名称,因此如果表名拼写错误并且您无法轻松修复它,您至少可以更改名称businesses 的正确拼写。我也将摆脱复数形式,并使其成为class Business。最后,在现有数据库上使用 Django 或 Rails 时,需要为 每个 表设置自定义表名的情况并不少见。

【讨论】:

不客气。 mgibsonbr 关于托管属性的提示也是一个很好的提示,可能对开发您的应用很有用。【参考方案2】:

顺便说一句,如果您想更改 (或删除) 所有 表的前缀,您可以提供自己的元类.如果您有多个案例,例如 Businesses,您希望类名和表名相同,这将非常有用。

例如,以下代码为所有表添加前缀FOO_ 而不是appname_

class MyModelBase( ModelBase ):
    def __new__( cls, name, bases, attrs, **kwargs ):
        if name != "MyModel":
            class MetaB:
                db_table = "FOO_" + name

            attrs["Meta"] = MetaB

        r = super().__new__( cls, name, bases, attrs, **kwargs )
        return r       

class MyModel( Model, metaclass = MyModelBase ):
    class Meta:
        abstract = True

class Businesses( MyModel ):
    ...

【讨论】:

【参考方案3】:

您可以使用db_table 属性在模型的 Meta 类中指定表名。

另外,如果您使用的是已经存在的数据库表,您可能还想查看managed 属性。将模型设置为非托管syncdb 后不会影响它(例如,如果您重置应用程序),但您仍然可以正常使用 Django 的 ORM。

【讨论】:

【参考方案4】:

您实际上可以使用元类手动设置表名,更多信息在这里: https://docs.djangoproject.com/en/dev/ref/models/options/

【讨论】:

以上是关于如何删除 Django 模型的表前缀?的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定数据库中删除所有带有前缀“bkp”的表?

如何使用 django-south 恢复删除的表?

Django 1.9 URLField 删除必要的 http:// 前缀

如何在 django (1.8) 迁移中删除索引 varchar_pattern_ops?

Django 删除了 DDBB 表,不能再迁移:没有这样的表错误

如何在 Django 中删除单个模型,并留下其他模型