Django 1.7 - makemigrations未检测到更改

152 投票
36 回答
147257 浏览
提问于 2025-04-18 14:26

正如标题所说,我似乎无法让迁移功能正常工作。

这个应用最开始是用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 个回答

16

我同意@furins的看法。如果一切看起来都正常,但还是出现了这个问题,检查一下你在模型类中要添加的属性是否有同名的方法。

  1. 先把和你要添加的属性同名的方法删掉。
  2. 运行命令:manage.py makemigrations my_app
  3. 再运行命令:manage.py migrate my_app
  4. 最后把那些方法再加回来。
21

我的解决方案在这里没有被提到,所以我来分享一下。我之前在一个项目中使用了 syncdb,只是为了让它能正常运行。然后当我尝试开始使用 Django 的迁移功能时,最开始它假装在进行迁移,最后却说“没问题”,但数据库里什么也没有变化。

我的解决办法是删除我应用的所有迁移文件,还有 django_migrations 表里关于这个应用迁移的记录。

然后我就用以下命令进行了初始迁移:

./manage.py makemigrations my_app

接着又执行了:

./manage.py migrate my_app

现在我可以顺利地进行迁移了。

84

这可能是由于以下原因造成的:

  1. 你没有在settings.py文件中的INSTALLED_APPS列表里添加你的应用程序。 (你需要根据你使用的Django版本,添加应用名称或者在应用文件夹的apps.py里AppConfig子类的点状路径)。可以参考文档: INSTALLED_APPS)
  2. 你的应用里没有migrations文件夹。(解决办法:只需创建这个文件夹)。
  3. 你的migrations文件夹里没有__init__.py文件。(解决办法:只需创建一个名为__init__.py的空文件)
  4. 你的应用文件夹里没有__init__.py文件。(解决办法:只需创建一个名为__init__.py的空文件)
  5. 你的应用里没有models.py文件。
  6. 你在models.py里的Python类(应该是模型)没有继承django.db.models.Model
  7. 你在models.py里定义模型时有一些语义错误。

注意: 一个常见的错误是把migrations文件夹添加到.gitignore文件里。当从远程仓库克隆时,migrations文件夹和/或__init__.py文件会在本地仓库中缺失。这会导致问题。

迁移文件应该包含在仓库中。可以在这里阅读。如果你的团队经常遇到迁移问题,可以考虑忽略迁移文件,方法如下:

我建议通过在.gitignore文件中添加以下行来忽略迁移文件:

*/migrations/*
!*/migrations/__init__.py

记住,根据Django文档,不推荐忽略迁移文件。

195

如果你是从一个用 Django 1.6 做的旧应用转过来的话,你需要先做一步准备(这是我发现的),这个步骤在文档里有提到:

python manage.py makemigrations 你的应用标签

文档没有明确说明你需要在命令中加上应用标签,因为它一开始告诉你要做的就是 python manage.py makemigrations,但这样会失败。初始的迁移是在你创建应用时在 1.7 版本中完成的,但如果你是从 1.6 过来的,那这个步骤就没有执行。想了解更多细节,可以查看文档中的 '给应用添加迁移' 部分。

31

好吧,看起来我漏掉了一个明显的步骤,不过我发这个是想提醒其他人也别犯同样的错误。

在升级到1.7版本的时候,我的模型变成了不受管理的状态(managed = False)——之前我把它设置成了True,但现在似乎又变回来了。

我把那一行删掉(让它默认变成True),然后运行了makemigrations,结果立刻生成了迁移模块,现在一切正常了。其实makemigrations在不受管理的表上是无法工作的(回头看这点真是显而易见)。

撰写回答