Django 1.7 - makemigrations未检测到更改
正如标题所说,我似乎无法让迁移功能正常工作。
这个应用最开始是用1.6版本的,所以我明白一开始是没有迁移的。确实,当我运行 python manage.py migrate
时,我得到了:
Operations to perform:
Synchronize unmigrated apps: myapp
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
如果我对 myapp
中的任何模型做了修改,它仍然显示为未迁移,这也是预期的结果。
但是当我运行 python manage.py makemigrations myapp
时,我得到了:
No changes detected in app 'myapp'
无论我怎么运行这个命令,它都没有检测到应用有任何变化,也没有为这个应用添加任何迁移文件。
有没有办法强制让一个应用进行迁移,基本上就是告诉系统“这是我工作的基础”之类的?还是说我漏掉了什么?
我的数据库是PostgreSQL的,如果这有帮助的话。
36 个回答
我同意@furins的看法。如果一切看起来都正常,但还是出现了这个问题,检查一下你在模型类中要添加的属性是否有同名的方法。
- 先把和你要添加的属性同名的方法删掉。
- 运行命令:manage.py makemigrations my_app
- 再运行命令:manage.py migrate my_app
- 最后把那些方法再加回来。
我的解决方案在这里没有被提到,所以我来分享一下。我之前在一个项目中使用了 syncdb
,只是为了让它能正常运行。然后当我尝试开始使用 Django 的迁移功能时,最开始它假装在进行迁移,最后却说“没问题”,但数据库里什么也没有变化。
我的解决办法是删除我应用的所有迁移文件,还有 django_migrations
表里关于这个应用迁移的记录。
然后我就用以下命令进行了初始迁移:
./manage.py makemigrations my_app
接着又执行了:
./manage.py migrate my_app
现在我可以顺利地进行迁移了。
这可能是由于以下原因造成的:
- 你没有在
settings.py
文件中的INSTALLED_APPS
列表里添加你的应用程序。 (你需要根据你使用的Django版本,添加应用名称或者在应用文件夹的apps.py里AppConfig子类的点状路径)。可以参考文档: INSTALLED_APPS) - 你的应用里没有
migrations
文件夹。(解决办法:只需创建这个文件夹)。 - 你的
migrations
文件夹里没有__init__.py
文件。(解决办法:只需创建一个名为__init__.py
的空文件) - 你的应用文件夹里没有
__init__.py
文件。(解决办法:只需创建一个名为__init__.py
的空文件) - 你的应用里没有
models.py
文件。 - 你在
models.py
里的Python类(应该是模型)没有继承django.db.models.Model
。 - 你在
models.py
里定义模型时有一些语义错误。
注意:
一个常见的错误是把migrations
文件夹添加到.gitignore
文件里。当从远程仓库克隆时,migrations
文件夹和/或__init__.py
文件会在本地仓库中缺失。这会导致问题。
迁移文件应该包含在仓库中。可以在这里阅读。如果你的团队经常遇到迁移问题,可以考虑忽略迁移文件,方法如下:
我建议通过在.gitignore
文件中添加以下行来忽略迁移文件:
*/migrations/*
!*/migrations/__init__.py
记住,根据Django文档,不推荐忽略迁移文件。
如果你是从一个用 Django 1.6 做的旧应用转过来的话,你需要先做一步准备(这是我发现的),这个步骤在文档里有提到:
python manage.py makemigrations 你的应用标签
文档没有明确说明你需要在命令中加上应用标签,因为它一开始告诉你要做的就是 python manage.py makemigrations
,但这样会失败。初始的迁移是在你创建应用时在 1.7 版本中完成的,但如果你是从 1.6 过来的,那这个步骤就没有执行。想了解更多细节,可以查看文档中的 '给应用添加迁移' 部分。
好吧,看起来我漏掉了一个明显的步骤,不过我发这个是想提醒其他人也别犯同样的错误。
在升级到1.7版本的时候,我的模型变成了不受管理的状态(managed = False
)——之前我把它设置成了True
,但现在似乎又变回来了。
我把那一行删掉(让它默认变成True
),然后运行了makemigrations
,结果立刻生成了迁移模块,现在一切正常了。其实makemigrations
在不受管理的表上是无法工作的(回头看这点真是显而易见)。