Django 1.7-移民检测不到变化

正如标题所说,我似乎不能让迁移工作。

该应用程序最初低于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 数据库。

135782 次浏览

在重命名旧的迁移文件夹后使用了 schemamigration my_app --initial吗?试试看。可能有用。如果没有,尝试重新创建数据库并使 syncdb + 迁移。对我很有效。

好吧,看来我错过了一个明显的步骤,但发布这个,以防其他人也这样做。

当升级到1.7的时候,我的模型变得非托管(managed = False)-我以前把它们当作 True,但是看起来它们被恢复了。

删除这一行(默认为 True)然后运行 makemigrations立即生成了一个迁移模块,现在它正在工作。makemigrations不能在非托管表上工作(这在事后看来是显而易见的)

如果您正在从 django 1.6中的现有应用程序进行更改,那么您需要执行文档中列出的一个预步骤(正如我发现的那样) :

Py 使移民 你的应用程序标签

文档并没有明确说明您需要将应用程序标签添加到命令中,因为它告诉您的第一件事是 python manage.py makemigrations,这将会失败。当你在1.7版本中创建你的应用程序时,初始的迁移就已经完成了,但是如果你来自1.6版本,它就不会被执行了。有关更多细节,请参见文档中的 “向应用程序添加迁移”

我有同样的问题,不得不两次移民还有各种各样奇怪的行为。原来,问题的根源在于我使用了一个函数来设置模型中的默认日期,所以每次运行 make 移民时,迁移都会检测到一个更改。这个问题的答案使我走上了正确的道路: 避免移民以重新创建日期字段

我的解决方案在这里没有涵盖,所以我发布它。我一直在使用 syncdb的一个项目-只是让它启动和运行。然后,当我试图开始使用 Django 迁移时,它首先伪造了它们,然后会说‘ OK’,但数据库没有任何变化。

我的解决方案是删除我的应用程序的所有迁移文件,我也是作为 django_migrations表中应用程序迁移的数据库记录。

然后我做了一个初始的迁移:

./manage.py makemigrations my_app

其次是:

./manage.py migrate my_app

现在我可以毫无问题地进行迁移了。

也许这能帮到别人。我用的是嵌套应用。Appname 和我实际上在 INSTALLED _ APPS 中有 project 和 project.appname。从 INSTALLED _ APPS 中删除项目允许检测更改。

你要检查 INSTALLED_APPS列表中的 settings.py,并确保所有带型号的应用程序都列在那里。

在项目文件夹中运行 makemigrations意味着它将更新与该项目的 settings.py中包含的所有应用程序相关的所有表。一旦你包含它,makemigrations将自动包含应用程序(这节省了大量的工作,所以你不必运行 makemigrations app_name为每个应用程序在您的项目/网站)。

答案就在 cdvv7788Django 的迁移1.7的这篇堆栈溢出文章中

如果你是第一次迁移这个应用程序,你必须使用:

Py makhemations myappname 一旦你这样做了,你可以这样做:

如果你的应用程序在数据库中,修改它的模型 它没有更新你可能没有的移民的变化 将模型更改为原始形式,然后运行 第一个命令(与应用程序名称)和迁移... 它将伪造它。一次 你这样做,放回你的模型的变化,运行 mak 移民和 再次迁移,应该可以工作。

我也遇到了同样的麻烦,而且上面的方法非常有效。

我已经将我的 django 应用程序迁移到了 Cloud 9,但是由于某些原因,我从未捕捉到最初的迁移过程。

为了防止您有一个特定的字段没有被 make 移民标识: 如果您有一个同名的属性,请检查两次。

例如:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)


# ... later


@property
def field(self):
pass

属性将“覆盖”字段定义,因此更改不会被 makemigrations识别

这是一个愚蠢的错误,但是在模型类中的字段声明行的末尾多加一个逗号,使得该行没有任何效果。

当您从迁移中复制粘贴 def. 时会发生这种情况,迁移本身被定义为一个数组。

不过这也许能帮到某些人: -)

像我这样不喜欢迁徙的人可以使用下面的步骤。

  1. 删除要同步的更改。
  2. 运行 python manage.py makemigrations app_label进行初始迁移。
  3. 在进行更改之前运行 python manage.py migrate以创建表。
  4. 粘贴第一步删除的更改。
  5. 跑两步,三步。

如果您混淆了这些步骤中的任何一个,请阅读迁移文件。更改它们以更正模式或删除不需要的文件,但不要忘记更改下一个迁移文件的依赖项部分;)

我希望这将有助于某人在未来。

同意@furins。如果一切似乎是有序的,但这个问题出现了,检查是否有任何属性方法与您试图添加到模型类中的属性相同的标题。

  1. 移除名称与要添加的属性相似的方法。
  2. Py 使移民成为我的应用程序
  3. Py 迁移我的 _ app
  4. 重新添加方法。

添加这个答案是因为只有这个方法对我有帮助。

我删除了运行 makemigrationsmigratemigrations文件夹。
它仍然说: < em > 没有迁移可以申请。

我转到 migrate文件夹并打开最后创建的文件,
注释我想要的迁移(它被检测到并进入了那里)
再次运行 migrate

这基本上是手动编辑迁移文件。
只有在理解文件内容时才这样做。

下面这句话对我很有用:

  1. 将应用程序名添加到 setings.py
  2. 使用‘ python management. py makhemations’
  3. 使用‘ python management. py shift’

对我有用: Python 3.4,Django 1.10

确保你的型号不是 abstract。我确实犯了这个错误,花了点时间,所以我想我应该把它贴出来。

我最近将 Django 从1.6升级到了1.8,并且几乎没有应用程序和迁移。我在 Django 1.6中使用 South 和 schemamigrations创建迁移,在 Django 1.8中删除了它们。

当我在升级后添加新型号时,makemigrations命令没有检测到任何更改。然后我尝试了@drojf (第一个回答)提出的解决方案,它工作得很好,但是没有应用假的初始迁移(python manage.py --fake-initial)。我这样做是因为我的表(旧表)已经创建好了。

最后,这个方法对我很有效,从 models.py 中删除了新的模型(或者模型更改) ,然后不得不删除(或者为了安全备份而重命名)所有应用的迁移文件夹,并为所有应用运行 python manage.py make 迁移,然后执行 python manage.py migrate --fake-initial。这招真管用。一旦为所有应用程序创建了初始迁移,然后添加新的模型,遵循 makemigrations的常规过程,并在该应用程序上进行迁移。现在检测到了变化,一切正常。

我只是想在这里分享它,如果有人面临同样的问题(他们的应用程序使用南方的 schemamigrations) ,它可能会帮助他们:)

也许这能帮到别人,我也有同样的问题。

我已经用序列化器类和视图创建了两个表。 所以当我想更新的时候,出现了这个错误。

我遵循以下步骤:

  1. 我做了 .\manage.py makemigrations app
  2. 我执行了 .\manage.py migrate
  3. 我把 models.py的两张表都擦掉了
  4. 我从序列化程序和视图类中删除了对表的所有引用。
  5. 我执行了步骤 12
  6. 我只是在 models.py中检索了我的更改
  7. 我再次执行步骤 5
  8. 我恢复了所有的变化。

如果你和 Pycharm 一起工作,当地的历史是非常有帮助的。

也许这能帮到别人。

我已经删除了我的 models.py,并期望 makemigrations创建 DeleteModel语句。

记得删除 *.pyc文件!

也许我来得太晚了,但你有没有尝试有一个 migrations文件夹在你的应用程序与 __init__.py文件在它?

./manage makemigrations
./manage migrate

迁移跟踪对 DB 的更改,因此如果从非托管更改为托管更改,则需要确保数据库表与所处理的 Model 相关,并且是最新的。

如果您仍然处于 dev 模式,我个人决定删除 IDE 中的迁移文件以及与 Model 相关的 django _  的迁移表中的迁移文件,然后重新運行上述命令。

记住: 如果迁移在 IDE 中以 _ 001结束,在数据库中以 _ 003结束。Django 只会查看是否有以 _ 004结尾的迁移,以便进行更新。

2(代码和数据库迁移)是链接的,并且是串行工作的。

编程愉快。

加上我的2C,因为这些解决方案都不适合我,但这个..。

我刚刚运行了 manage.py squashmigrations,并删除了旧的迁移(django.Migations 数据库表中的文件和行)。

这在上一个迁移文件中留下了这样一行:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

这显然使 Django 感到困惑,并导致了奇怪的行为: 运行 manage.py makemigrations my_app将重新创建初始迁移,就好像根本不存在一样。删除 replaces...线固定的问题!

这可能是由于以下原因:

  1. 您没有在 INSTALLED_APPS列表中的 < strong > settings.py中添加应用程序 (您必须在 app 文件夹中的 apps.py 中将 应用程序名称或虚线路径添加到 AppConfig 的子类中,这取决于您使用的 django 版本)。参考文档: < a href = “ https://docs.djangoproject.com/en/1.11/ref/sets/# std: set-INSTALLED _ APPS”rel = “ nofollow noReferrer”> 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中模型的定义有一些语义错误

注: 一个常见的错误是在 .gitignore文件中添加 migrations文件夹。当从远程回购克隆,migrations文件夹和/或 __init__.py文件将丢失在本地回购。这就造成了问题。

迁移文件应该包含在回购文件中。看这里.如果您的团队经常面临迁移问题,您可以考虑忽略以下迁移文件:

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

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

请记住,根据 django 文档,是 不推荐忽略迁移文件

增加了这个答案,因为没有其他可用的上述为我工作。

在我的例子中,更奇怪的事情发生了(Django 1.7版本) ,在我的 Models.py中,我在文件的末尾有一个 “额外”行(这是一个空行) ,当我执行 python manage.py makemigrations命令时,结果是: “未检测到任何变化”。

为了解决这个问题,我删除了这个 “空行”,这是在我的 Models.py文件的结尾,我再次运行的命令,一切都是固定的,所有的改变 Models.py被检测到!

也有同样的问题 确保无论您在 modes.py 中定义了什么类,您都必须继承 Model. Model 类。

class Product(models.Model):
title = models.TextField()
description = models.TextField()
price = models.TextField()

您可能需要使用下面的命令伪造初始迁移

python manage.py migrate --fake-initial

首先,这个解决方案适用于那些在 heroku 服务器上部署时面临同样问题的人,我也面临同样的问题。

要进行部署,需要执行一个强制步骤,即在 setings.py 文件中添加 django _ heroku. sets (local ())。

变化: 当我将上面的代码行更改为 django _ heroku. sets (local () ,database = False)时,它完美地工作了。

Python management. py make 移民账户 “帐户”的迁移: 帐户迁移0001 _ initial.py - 创建客户模型 - 创建模型标签 - 制作模型产品 - 建立模型订单

注意: 在这里“帐户”是我的应用程序名称

  1. 删除要同步的更改。
  2. 在初始迁移中运行 python management. py makhemations app _ label。
  3. 在进行更改之前,运行 pythonmange.py 迁移以创建表。
  4. 粘贴第一步删除的更改。
  5. 跑两步,三步

在我的例子中,我需要将我的模型添加到 _ Init _。我的模型被定义的 model 文件夹的 py 文件:

from myapp.models.mymodel import MyModel

我遇到了这个问题,命令

python manage.py makemigrations

一旦我保存了对文件所做的更改,就可以和我一起工作了。

原因之一可能是您没有在 admin.py 文件中注册您的模型。 首先在 admin.py 文件中注册模型,然后进行迁移。

我错误地从我的项目目录中删除了 migrations文件夹。

解决方案是在 migrations文件夹中创建 __init__.py文件,然后,

python manage.py makemigrations
python manage.py migrate

将应用程序加载到 setings.py 和 py

INSTALLED_APPS = [
'appname'
]

对我来说,我删除迁移文件的环境文件夹 env\Lib\site-packages\django\contrib\auth\migrations\...,但保持 __init__.py不删除它