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

red*_*ice 17 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)
Run Code Online (Sandbox Code Playgroud)

如果我直接使用Bussinesses,django将访问数据库中的"bussinesses_bussinesses"表,它显然不存在.

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

非常感谢.

Ben*_*kin 41

只需使用模型元选项.

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"
Run Code Online (Sandbox Code Playgroud)

BTW 业务拼写错误.由于您要指定表的名称,因此您不必为模型指定与表相同的名称,因此如果表名拼写错误并且您无法轻松修复它,则至少可以更改名称你的班级适当的拼写业务.我也会摆脱多元化,并成功class Business.最后,在现有数据库上使用Django或Rails需要为每个表设置自定义表名时并不罕见.


c z*_*c z 6

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