如何删除 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 模型的表前缀?的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.9 URLField 删除必要的 http:// 前缀
如何在 django (1.8) 迁移中删除索引 varchar_pattern_ops?