Django模型名称不区分大小写,对吧?

时间:2014-06-05 22:59:37

标签: python django django-models

如果我有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

FooBarFoobar都作为models的属性出现。但是,

>>> models.FooBar.__name__
'FooBar'
>>> models.Foobar.__name__
'FooBar'

并且两者都只是FooBar的db表的接口(默认为myapp_foobar)。

我问这个问题,因为在我看来,django模型名称不区分大小写,但我没有找到任何说明这一点的文档,而且this问题被回答为django模型名称是区分大小写。

1 个答案:

答案 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}}

在现实世界环境中,我永远不会在同一个应用中有两个相似的模型名称。这非常容易出错。