Python Django模型名称不区分大小写,对吗?
如果我有Python Django模型名称不区分大小写,对吗?,python,django,django-models,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\u APPS并执行syncdb,我只会将FooBar模型转换为db表。忽略Foobar模型 另一件需要注意的奇怪事情是,当
myapp/models.py
from django.db import models
class FooBar(models.Model):
x = models.BooleanField()
class Foobar(models.Model):
y = models.BooleanField()
然后将myapp
添加到INSTALLED\u APPS
并执行syncdb
,我只会将FooBar
模型转换为db表。忽略Foobar
模型
另一件需要注意的奇怪事情是,当我们
from myapp import models
FooBar
和FooBar
都作为模型的属性出现。但是,
>>> models.FooBar.__name__
'FooBar'
>>> models.Foobar.__name__
'FooBar'
这两个都只是FooBar
数据库表的接口(默认情况下myapp\u FooBar
)
我问这个问题是因为在我看来,django模型名称是不区分大小写的,但我还没有找到任何说明这个问题的文档,而且这个问题的回答大意是django模型名称是区分大小写的 Django模型名不区分大小写,但基本上,Django从应用程序和模型名创建一个小写的表名。因此,myapp
中的FooBar
将生成一个myapp\u FooBar表,FooBar
显然,在您的示例中,名称将重叠。Django应该对冲突的表名发出警告,但相反,它会默默地忽略冲突的模型
为了解决这个问题,我建议您为这两个模型使用显式和不同的表名。使用Meta内部类,并设置Meta.db_table。看
举例如下:
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模型名称不区分大小写,但基本上,Django从应用程序和模型名称创建一个小写的表名。因此,myapp
中的FooBar
将生成一个myapp\u FooBar表,FooBar
显然,在您的示例中,名称将重叠。Django应该对冲突的表名发出警告,但相反,它会默默地忽略冲突的模型
为了解决这个问题,我建议您为这两个模型使用显式和不同的表名。使用Meta内部类,并设置Meta.db_table。看
举例如下:
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'
在现实世界中,我永远不会在同一个应用程序中有两个相似的模型名。它极易出错。即使您的代码位于全新的项目中,问题仍然存在。Foobar
不会生成新表。它被完全忽略了。如果这个问题仅仅是默认表名(应用程序名加上小写版本模型名)的结果,那就很有意义了,但它似乎是其他人的问题。实际上,我不会用这样的名字。但困扰我的是这件事的原理,它可能与Django应用程序注册表有关。在文档的一页中,他们说“返回带有给定app_标签和Model_名称的模型”。也许向元类添加不同的app\u标签s可以做到这一点?(不是很优雅)我想这可能和你说的应用注册有关。以下是我的技巧:我创建了一个名为anotherapp
的新应用程序,将其models.py
留空,并将其添加到已安装的应用程序中。现在,如果我将app\u label='anotherapp'
放在Foobar
的Meta
选项中,然后在syncdb
上,我得到了所需的行为,即创建了表,并且模型的\uu名称是正确的。即使您的代码在一个全新的项目中,问题仍然存在。Foobar
不会生成新表。它被完全忽略了。如果这个问题仅仅是默认表名(应用程序名加上小写版本模型名)的结果,那就很有意义了,但它似乎是其他人的问题。实际上,我不会用这样的名字。但困扰我的是这件事的原理,它可能与Django应用程序注册表有关。在文档的一页中,他们说“返回带有给定app_标签和Model_名称的模型”。也许向元类添加不同的app\u标签s可以做到这一点?(不是很优雅)我想这可能和你说的应用注册有关。以下是我的技巧:我创建了一个名为anotherapp
的新应用程序,将其models.py
留空,并将其添加到已安装的应用程序中。现在,如果我将app\u label='anotherapp'
放在Foobar
的Meta
选项中,那么在syncdb
上,我得到了所需的行为,即创建了表,并且模型的\u名称是正确的。