python - Django 模型名称不区分大小写,对吗?

标签 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 模型转换为数据库 table 。 Foobar 模型被忽略。

另一个需要注意的奇怪的事情是当我们这样做的时候

from myapp import models

FooBarFoobar 都作为 models 的属性出现。然而,

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

两者都只是 FooBar 的数据库表的接口(interface)(默认为 myapp_foobar)。

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

最佳答案

Django 模型名称不区分大小写,但基本上,Django 从应用程序和模型名称创建一个小写的表名称。因此 myapp 中的 FooBar 将生成一个 myapp_foobar 表,Foobar 也是如此。

显然在您的示例中,名称会重叠。 Django 应该警告冲突的表名,而是默默地忽略冲突的模型。

要解决此问题,我建议您为两个模型使用明确且不同的表名。使用 Meta 内部类,并设置 Meta.db_table。查看Django documentation on models Meta .

给出的例子:

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'

在现实环境中,我绝不会在同一个应用中有两个相似的模型名称。它极易出错。

关于python - Django 模型名称不区分大小写,对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071574/

相关文章:

python - 类似于 thymeleaf "natural templates"for jinja2/python/django 的模板解决方案?

python - 如何在 Piston 类方法中访问 request.user

Django - 如何根据使用权限动态生成菜单

python - 如果下一步不存在,则尝试隐藏按钮

django - 如何过滤同一列的多个值

python - Discord Bot 中的 AFK 功能

python - 使用 TensorFlow 使用三个或更多输入数字来预测数字

python - 在函数内更改全局变量

python - 表单 Request.GET 仅从多个选定字段中获取 1 个值

python - self.assertTrue(response.content 中的 post.text) – 断言错误