如果我有myapp/models.py
from django.db import models
class FooBar(models.Model):
x = models.BooleanField()
class Foobar(models.Model):
y = models.BooleanField()
并将myapp
添加到INSTALLED_APPS
并执行syncdb
,我只将FooBar
模型转换为db表。 Foobar
模型被忽略。
另一个值得注意的奇怪事项是,当我们做
时from myapp import models
FooBar
和Foobar
都作为models
的属性出现。但是,
>>> models.FooBar.__name__
'FooBar'
>>> models.Foobar.__name__
'FooBar'
并且两者都只是FooBar
的db表的接口(默认为myapp_foobar
)。
我问这个问题,因为在我看来,django模型名称不区分大小写,但我没有找到任何说明这一点的文档,而且this问题被回答为django模型名称是区分大小写。
答案 0 :(得分:2)
Django模型名称不区分大小写,但基本上,Django从应用程序和模型名称创建小写表名。因此,FooBar
中的myapp
将生成myapp_foobar表,Foobar
也将生成。class FooBar(models.Model):
x = models.BooleanField()
class Meta:
db_table = 'myapp_foobar_one'
class Foobar(models.Model):
x = models.BooleanField()
class Meta:
db_table = 'myapp_foobar_two'
。
显然,在您的示例中,名称将重叠。 Django应该警告冲突的表名,而是默默地忽略冲突的模型。
要解决此问题,我建议您为两个模型提供明确且不同的表名。使用Meta内部类,并设置Meta.db_table。请参阅Django documentation on models Meta。
给出的例子:
{{1}}
在现实世界环境中,我永远不会在同一个应用中有两个相似的模型名称。这非常容易出错。