我创建了一个名为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。
非常感谢。
答案 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 ):
...