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

时间:2012-03-24 06:31:50

标签: django model

我创建了一个名为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”表,它显然不存在。

因为表“bussinesses”也被另一个APP使用,所以无法重命名。 我想知道如何使用Djano模型而不使用表前缀,我不想直接使用原始数据库API。

非常感谢。

4 个答案:

答案 0 :(得分:38)

只需使用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 商家拼写错误。由于您要指定表的名称,因此您不必为模型指定与表相同的名称,因此如果表名拼写错误并且您无法轻松修复它,则至少可以更改名称你的班级正确拼写商店。我也会摆脱多元化,并使它成为class Business。最后,在现有数据库上使用Django或Rails需要为每个表设置一个自定义表名时,这种情况并不少见。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你可以使用元类手动设置表名,更多信息请点击这里: https://docs.djangoproject.com/en/dev/ref/models/options/

答案 3 :(得分:0)

顺便说一句,如果您想更改(或删除) all 表的前缀,则可以提供自己的元类。如果您有多个情况,例如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 ):
    ...