Django 1.7 - makemigrations没有检测到变化

时间:2014-07-23 13:44:54

标签: python django django-1.7 django-migrations

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

该应用最初的版本低于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,如果它有帮助的话。

30 个答案:

答案 0 :(得分:176)

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

  

python manage.py makemigrations your_app_label

文档并没有明确表示您需要在命令中添加应用程序标签,因为它告诉您的第一件事是python manage.py makemigrations将失败。初始迁移是在1.7版本中创建应用程序时完成的,但如果您来自1.6,则不会执行。有关详细信息,请参阅文档中的'Adding migration to apps'

答案 1 :(得分:30)

这可能由于以下原因而发生:

  1. 您未在 INSTALLED_APPS settings.py 列表中添加该应用 (您必须在应用程序文件夹的apps.py中添加应用程序名称或虚线路径到AppConfig的子类,具体取决于您使用的django版本)。请参阅文档: INSTALLED_APPS
  2. 您在这些应用中没有 migrations 文件夹。 (解决方案:只创建该文件夹)。
  3. 您在这些应用的 __init__.py 文件夹中没有 migrations 文件。 (解决方案:只需创建一个名为 __ init __。py
  4. 的空文件
  5. 您在app文件夹中没有 __init__.py 文件。 (解决方案:只需创建一个名为 __ init __。py
  6. 的空文件
  7. 您在应用中没有 models.py 文件
  8. models.py 中的Python类(应该是模型)不会继承 django.db.models.Model
  9. models.py
  10. 中的模型定义存在语义错误

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

    我建议通过将以下行添加到.gitignore文件

    来忽略迁移文件
    */migrations/*
    !*/migrations/__init__.py
    

答案 2 :(得分:27)

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

升级到1.7时,我的模型变得不受管理(managed = False) - 我之前将它们设为True但似乎已恢复。

删除该行(默认为True)然后立即运行makemigrations创建了一个迁移模块,现在它正在运行。 makemigrations将不适用于非托管表(事后很明显)

答案 3 :(得分:18)

我的解决方案不在此处,所以我发布了它。我一直在使用syncdb作为项目 - 只是为了让它运行起来。然后,当我尝试开始使用Django迁移时,它首先伪造它们然后会说它“OK”但数据库没有发生任何事情。

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

然后我刚刚进行了初始迁移:

./manage.py makemigrations my_app

接下来是:

./manage.py migrate my_app

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

答案 4 :(得分:15)

同意@furins。如果一切看起来都是有序的,但是出现了这个问题,请检查是否有任何属性方法与您尝试在Model类中添加的属性具有相同的标题。

  1. 删除与您要添加的属性名称相似的方法。
  2. manage.py makemigrations my_app
  3. manage.py migrate my_app
  4. 重新添加方法。

答案 5 :(得分:11)

这是一个愚蠢的错误,但在模型类的字段声明行的末尾有一个额外的逗号,使该行无效。

复制粘贴def时会发生这种情况。来自迁移,它本身被定义为一个数组。

虽然这可能对某人有所帮助: - )

答案 6 :(得分:10)

也许我为时已晚,但您是否尝试在应用中设置migrations文件夹,其中包含__init__.py个文件?

答案 7 :(得分:7)

答案在这个stackoverflow帖子上,由cdvv7788 Migrations in Django 1.7

  

如果您是第一次迁移该应用,则必须使用:

     

manage.py makemigrations myappname完成后,您可以执行以下操作:

     

manage.py migrate如果您的应用程序位于数据库中,请修改其模型   并且它没有更新你可能没有的makemigrations的更改   迁移了它。将模型更改回原始形式,运行   第一个命令(使用应用程序名称)并迁移...它会伪造它。一旦   你这样做会在模型上放回更改,运行makemigrations和   再次迁移,它应该工作。

我遇到了同样的麻烦,并且完成了上述工作。

我已将我的django应用程序移至cloud9,由于某种原因,我从未捕获过初始迁移。

答案 8 :(得分:7)

以下为我工作:

  1. 将应用名称添加到settings.py
  2. 使用'python manage.py makemigrations'
  3. 使用'python manage.py migrate'
  4. 为我工作:Python 3.4,Django 1.10

答案 9 :(得分:6)

也许这会对某人有所帮助。我正在使用嵌套的应用程序。 project.appname和我实际上在INSTALLED_APPS中有project和project.appname。从INSTALLED_APPS中删除项目允许检测到更改。

答案 10 :(得分:6)

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

  1. 删除要同步的更改。
  2. 运行python manage.py makemigrations app_label进行初始迁移。
  3. 在进行更改之前运行python manage.py migrate以创建表。
  4. 粘贴您在第一步中删除的更改。
  5. 运行2.和3.步骤。
  6. 如果您对这些步骤中的任何一个感到困惑,请阅读迁移文件。更改它们以更正您的架构或删除不需要的文件,但不要忘记更改下一个迁移文件的依赖项部分;)

    我希望这将有助于将来。

答案 11 :(得分:5)

您想查看settings.py列表中的INSTALLED_APPS,并确保其中列出了所有带模型的应用。

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

答案 12 :(得分:4)

如果您有一个特定字段无法通过makemigrations识别:如果您有一个具有相同名称的属性,请检查两次。

示例:

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

# ... later

@property
def field(self):
    pass

该属性将"覆盖"字段定义因此makemigrations

无法识别更改

答案 13 :(得分:4)

添加此答案,因为只有这种方法对我有帮助。

我删除了 migrations 文件夹makemigrationsmigrate
它仍然说:无需迁移。

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

这基本上是手动编辑迁移文件 仅在您了解文件内容时执行此操作。

答案 14 :(得分:4)

确保您的模型不是abstract。我实际上犯了这个错误并花了一段时间,所以我想我会发布它。

答案 15 :(得分:3)

重命名旧的迁移文件夹后,您是否使用过schemamigration my_app --initial?试试吧。可能会工作。如果不是 - 尝试重新创建数据库并进行syncdb + migrate。它对我有用......

答案 16 :(得分:1)

对于我来说,我需要将模型添加到定义了模型的models文件夹的_ init _。py文件中:

from myapp.models.mymodel import MyModel

答案 17 :(得分:1)

  1. 删除更改要同步的内容。
  2. 运行python manage.py makemigrations app_label进行初始迁移。
  3. 在进行更改之前,运行python manage.py migration来创建表。
  4. 粘贴更改,您将在第一步将其删除。
  5. 运行2.和3.步骤

答案 18 :(得分:1)

遇到相同的问题 确保您在models.py中定义了任何类,都必须继承models.Model类。

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

答案 19 :(得分:1)

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

升级后添加新模型时,makemigrations命令未检测到任何更改。然后我尝试了@drojf建议的解决方案(第一个答案),它工作正常,但未能应用虚假的初始迁移(python manage.py --fake-initial)。我这样做是因为我的桌子(旧桌子)已经创建了。

最后这对我有用,从models.py中删除了新模型(或模型更改),然后必须删除(或重命名安全备份)所有应用程序的迁移文件夹,并为所有应用程序运行python manage.py makemigrations ,然后python manage.py migrate --fake-initial。这就像一个魅力。为所有应用创建初始迁移并假冒初始迁移后,添加新模型并遵循常规流程makemigrations并在该应用上迁移。现在检测到这些变化,一切都很顺利。

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

答案 20 :(得分:1)

./manage makemigrations
./manage migrate

迁移跟踪对数据库的更改,因此如果您从非托管更改为托管,则需要确保您的数据库表是与您正在处理的模型相关的最新版本。

如果您仍处于开发模式,我个人决定删除IDE中的迁移文件以及与我的模型相关的django_migrations表,并重新运行上述命令。

请记住:如果您的IDE中有一个以_001结尾的迁移,那么_003在您的数据库中。 Django只会查看是否有以_004结尾的迁移,以便更新任何内容。

2(代码和数据库迁移)是链接在一起工作的。

快乐的编码。

答案 21 :(得分:1)

也许这会对某人有所帮助。

我已删除了models.py和预期makemigrations以创建DeleteModel语句。

请务必删除 *.pyc 文件!

答案 22 :(得分:1)

也许这可以帮助别人,我遇到了同样的问题。

我已经使用序列化程序类和视图创建了两个表。 所以,当我想要更新时,我遇到了这个错误。

我按照以下步骤操作:

  1. 我做了.\manage.py makemigrations app
  2. 我执行了.\manage.py migrate
  3. 我删除了models.py
  4. 的两个表格
  5. 我从序列化程序和视图类中删除了对表的所有引用。
  6. 我执行了步骤12
  7. 我在models.py
  8. 中检索了我的更改
  9. 我再次执行了步骤5
  10. 我恢复了所有的更改。
  11. 如果您正在使用Pycharm,本地历史记录非常有用。

答案 23 :(得分:1)

我遇到了两次运行makemigrations以及各种奇怪行为的问题。原来问题的根源在于我使用了一个函数在我的模型中设置默认日期,因此每次运行makemigrations时迁移都会检测到更改。这个问题的答案让我走上正轨:Avoid makemigrations to re-create date field

答案 24 :(得分:0)

添加了这个答案,因为以上其他任何一个都不适合我。

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

要解决此问题,我删除了 models.py 文件末尾的“空白行”,我确实再次运行了命令,一切都已修复,检测到对 models.py 所做的所有更改!

答案 25 :(得分:0)

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

python manage.py migrate --fake-initial

答案 26 :(得分:0)

首先,此解决方案适用于在heroku服务器上部署期间遇到相同问题的人,而我也面临相同的问题。

要进行部署,有一个强制性步骤是在settings.py文件中添加django_heroku.settings(locals())。

更改: 当我将以上行更改为django_heroku.settings(locals(),database = False)时,它可以完美地工作。

答案 27 :(得分:0)

我遇到过这个问题,命令

python manage.py makemigrations

在我保存对文件所做的更改后与我一起工作。

答案 28 :(得分:-1)

添加我的2c,因为这些解决方案都不适合我,但这确实......

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

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

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...行可解决问题!

答案 29 :(得分:-1)

python manage.py makemigrations帐户 迁移“帐户”: 帐户\ migrations \ 0001_initial.py -创建模型客户 -创建模型标签 -创建模型产品 -创建模型订单

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