manage.py syncdb未为某些模型添加表
我今天的第二个问题有点不太专业:我有一个Django项目,里面安装了四个应用。当我运行manage.py syndb的时候,它只为其中两个应用创建了表。根据我的了解,我的模型文件里没有问题,而且所有的应用都在设置文件的INSTALLED_APPS里列出来了。manage.py syndb似乎就是忽略了我的两个应用。
这两个被“忽略”的应用有一个共同点,就是它们的模型文件从另外两个应用中导入了模型,并把它们当作外键使用(我不知道这样做是好是坏,但这样让我更有条理)。不过我觉得这不是问题,因为我把那些有外键的模型注释掉了,表还是没有被创建。我真是搞不懂了。
更新:当我注释掉从其他应用导入模型文件的那几行时,syndb就能创建我的表了。也许我对不同应用中的模型文件之间的关系理解得不够透彻。我以为只要简单地导入另一个应用的模型,就可以把它当作外键使用。难道不是这样吗?
2 个回答
我觉得我遇到过类似的情况。
我曾经有个问题,就是一个模型没有被重置。后来发现是我的模型里有个错误,但这个错误没有被显示出来。
不过我觉得在运行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的时候,你应该会看到一个错误。
很不幸的是,当你的应用程序在models.py文件中有导入错误时,manage.py不会给你任何提示就默默失败了(参考ticket #10706)。这很可能是因为你的models.py文件中有拼写错误……所以要仔细检查所有的导入语句(或者使用pylint工具来帮你检查)。
最近,我的syncdb停止加载我的几个应用程序,而sqlall给了我一个错误提示:“找不到标签为foo的应用”。我不知道这有时意味着“找到了标签为foo的应用,但由于出现了导入错误,无法加载”,所以我花了半个小时才意识到我在一个models.py文件中错误地导入了'haslib',其实应该是'hashlib'。