manage.py syncdb未为某些模型添加表

4 投票
2 回答
8415 浏览
提问于 2025-04-15 14:22

我今天的第二个问题有点不太专业:我有一个Django项目,里面安装了四个应用。当我运行manage.py syndb的时候,它只为其中两个应用创建了表。根据我的了解,我的模型文件里没有问题,而且所有的应用都在设置文件的INSTALLED_APPS里列出来了。manage.py syndb似乎就是忽略了我的两个应用。

这两个被“忽略”的应用有一个共同点,就是它们的模型文件从另外两个应用中导入了模型,并把它们当作外键使用(我不知道这样做是好是坏,但这样让我更有条理)。不过我觉得这不是问题,因为我把那些有外键的模型注释掉了,表还是没有被创建。我真是搞不懂了。

更新:当我注释掉从其他应用导入模型文件的那几行时,syndb就能创建我的表了。也许我对不同应用中的模型文件之间的关系理解得不够透彻。我以为只要简单地导入另一个应用的模型,就可以把它当作外键使用。难道不是这样吗?

2 个回答

8

我觉得我遇到过类似的情况。

我曾经有个问题,就是一个模型没有被重置。后来发现是我的模型里有个错误,但这个错误没有被显示出来。

不过我觉得在运行syncdb的时候,应该会显示出某种错误。

无论如何,试着从命令行导入你的模型文件,看看能不能成功。

$ manage.py shell
>>> from myapp import models
>>>

如果文件里有错误,这个操作应该能指出来。

根据你的更新,听起来你可能遇到了交叉导入的问题。不要这样做:

from app1.models import X

class ModelA(models.Model):
    fk = models.ForeignKey(X)

试试这样:

class ModelA(models.Model):
    fk = models.ForeignKey("app1.X")

...不过我觉得在运行syncdb的时候,你应该会看到一个错误。

6

很不幸的是,当你的应用程序在models.py文件中有导入错误时,manage.py不会给你任何提示就默默失败了(参考ticket #10706)。这很可能是因为你的models.py文件中有拼写错误……所以要仔细检查所有的导入语句(或者使用pylint工具来帮你检查)。

最近,我的syncdb停止加载我的几个应用程序,而sqlall给了我一个错误提示:“找不到标签为foo的应用”。我不知道这有时意味着“找到了标签为foo的应用,但由于出现了导入错误,无法加载”,所以我花了半个小时才意识到我在一个models.py文件中错误地导入了'haslib',其实应该是'hashlib'。

撰写回答