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

2 投票
1 回答
2684 浏览
提问于 2025-04-18 08:48

如果我有 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 这个模型变成了数据库表。Foobar 这个模型却被忽略了。

还有一个奇怪的地方是,当我们执行

from myapp import models

时,FooBarFoobar 都作为 models 的属性存在。不过,

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

它们实际上都是指向 FooBar 的数据库表(默认是 myapp_foobar)。

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

1 个回答

6

Django的模型名称是区分大小写的,但基本上,Django会根据应用和模型的名称生成一个小写的表名。因此,像FooBar这样的模型,如果在myapp这个应用里,就会生成一个名为myapp_foobar的表,Foobar也是一样。

显然,在你的例子中,这些名称会发生冲突。Django应该会警告你有重复的表名,但实际上,它会默默地忽略这些冲突的模型。

为了解决这个问题,我建议你为这两个模型使用明确且不同的表名。可以使用Meta内部类,并设置Meta.db_table。具体可以参考Django文档中的模型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'

在实际环境中,我绝对不会在同一个应用里有两个相似的模型名称。这是非常容易出错的。

撰写回答