Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型名称不区分大小写,对吗?_Python_Django_Django Models - Fatal编程技术网

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名称是正确的。