Django的1.7 - makemigrations未检测变化

问题描述 投票:130回答:24

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

该应用程序最初是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的一个没有什么帮助的。

python django django-1.7 django-migrations
24个回答
179
投票

如果你从你在Django 1.6由现有的应用程序切换,那么你需要做一个预一步的文档中列出(我发现):

蟒蛇manage.py makemigrations your_app_label

文档没有使它明显,你需要的应用程序添加标签的命令,它会告诉你做的第一件事就是python manage.py makemigrations将失败。当您创建1.7版本的应用程序的初始迁移已完成,但如果从1.6来了就不会被执行。查看文档中的'Adding migration to apps'了解更多详情。


7
投票

以下为我工作:

  1. 添加应用程序名称的settings.py
  2. 使用“蟒蛇manage.py makemigrations”
  3. 使用“蟒蛇manage.py迁移”

工作对我来说:Python的3.4,Django的1.10


6
投票

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

  1. 删除你想要同步的变化。
  2. 初始运行迁移python manage.py makemigrations app_label
  3. 创建表进行更改之前,运行python manage.py migrate
  4. 粘贴您删除在第一步的变化。
  5. 运行2和3的步骤。

如果你感到困惑任何一个步骤,阅读迁移文件。改变他们改正你的架构或删除不需要的文件,但不要忘记改变一个迁移文件的依赖性来;)

我希望这将帮助别人的未来。


5
投票

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

在项目文件夹运行makemigrations意味着它会寻找更新所有涉及到包括在settings.py项目的所有应用程序表。一旦你包含它,makemigrations将自动包括应用程序(这样可以节省大量的工作,所以你不必跑makemigrations app_name在你的项目/网站每一个应用程序)。


5
投票

万一你有没有得到通过makemigrations标识的特定字段:两次检查,如果你有相同名称的属性。

例:

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

# ... later

@property
def field(self):
    pass

该属性将“覆盖”字段定义这样的改变将不会被makemigrations鉴定


4
投票

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

我删除了文件夹migrations运行makemigrationsmigrate。 它仍然说:不迁移申请。

我去migrate文件夹并打开最后一个创建的文件, 发表评论我要迁移(它是检测并进入那里) 并再次运行migrate

这基本上编辑迁移手动档。 做到这一点只有当你了解文件内容。


4
投票

确保你的模型没有abstract。其实,我犯了那个错误,并用了一段时间,所以我想我会发布它。


3
投票

难道u使用schemamigration my_app --initial重命名旧移民文件夹后?试试吧。可能工作。如果没有 - 尝试重新创建数据库,并执行syncdb +迁移。它的工作对我来说...


2
投票

有同样的问题让你在models.py定义确保任何类,你必须要继承models.Model类。

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

1
投票

我曾与不必运行makemigrations两次同样的问题,各种奇怪的行为。原来,根本的问题是,我是用函数来设置默认的日期在我的模型,以便迁移每隔我跑makemigrations时间检测的变化。回答这个问题使我在正确的轨道上:Avoid makemigrations to re-create date field


1
投票

我最近升级Django的从1.6到1.8,并有一些应用程序和迁移他们。我用南部和schemamigrations为在Django 1.6,这是在Django 1.8降到创建迁移。

当我升级后增加了新车型,makemigrations命令没有检测到任何变化。然后我试图通过@drojf(1日回答)提出的解决方案,它工作得很好,但没有提出申请假初始迁移(python manage.py --fake-initial)。我这样做是我的表(旧表)已创建。

最后,这个工作对我来说,除去从models.py新车型(或模型更改),然后不得不删除(或重命名为安全备份),所有的应用程序的所有应用程序和运行蟒蛇manage.py makemigrations的迁移文件夹,然后做python manage.py migrate --fake-initial。这工作就像一个魅力。一旦最初的迁移所有的应用程序创建和假冒迁移初期,然后加入新的模式和遵循makemigrations的经常性进程,并迁移对应用程序。现在检测到的变化,一切都很好。

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


40
投票

这可能以下原因发生的原因:

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

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

我建议加入以下行.gitignore文件gitignore迁移文件

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

1
投票

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

我已经创建了串行类和视图中的两个表。所以,当我想更新的,我有这个错误。

我跟着这个步骤:

  1. 我做了.\manage.py makemigrations app
  2. 我执行.\manage.py migrate
  3. 我抹去我的models.py的两个表
  4. 我消除了所有的参考,从串行器和视图类我的表。
  5. 我执行的步骤12
  6. 我只是取回我的变化在models.py
  7. 我再次执行步骤5
  8. 我恢复了我的所有变化。

如果你使用Pycharm工作,当地的历史是非常有帮助的。


1
投票

也许这将帮助别人。

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

记得删除*.pyc文件!


1
投票
./manage makemigrations
./manage migrate

迁移跟踪。因此如果您从非托管更改为托管更改数据库,你需要确保您选择数据库表达与你处理模型日期。

如果你仍然在开发者模式,我个人决定删除我的IDE以及在与我的模型的django_migrations表迁移文件并重新运行上面的命令。

记住:如果你有一个在你的IDE _001和_003数据库中的结束迁移。 Django将只能看到如果你有_004任何内容更新结束迁移。

的2(代码&分贝迁移)连接和串联工作。

编码愉快。


0
投票

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

在我的情况下一些更奇怪的是发生(Django的1.7版),在我的models.py我有一个“额外”的线在我的文件结尾(这是一个空行),当我执行命令python manage.py makemigrations的结果:“没有检测到变化”。

为了解决这个问题我删除这个“空白行”那是我的models.py文件的末尾,我并再次运行该命令,一切都被固定并检测到models.py所做的所有更改!


0
投票

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

python manage.py migrate --fake-initial

-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...线固定的问题!


28
投票

好吧,看起来像我错过了一个明显的阶梯,但如果其他人做同样的张贴此。

当升级到1.7,我的模型成为非托管(managed = False) - 我让他们为True之前,但似乎它得到了恢复。

删除该行(默认为真),然后运行makemigrations立即作出了迁移模块,现在它的工作。 makemigrations不会在非托管表的工作(这是明显在事后)


19
投票

在这里不讨论我的解决办法,所以我张贴。我一直在使用syncdb一个项目,只是为了得到它运行起来。然后,当我试图启动使用Django迁移,它伪造了他们的第一个,然后会说这是“OK”,但什么也没有发生到数据库中。

我的解决办法只是删除所有我的应用程序迁移文件,以及数据库记录在django_migrations表中的应用程序迁移。

然后,我只是做了一个初步的迁移有:

./manage.py makemigrations my_app

其次是:

./manage.py migrate my_app

现在,我可以使迁移没有问题。


15
投票

与@furins同意。如果一切似乎是为了,但这个问题出现的时候,结账,如果有任何财产法相同的标题,你正试图在Model类中添加的属性。

  1. 类似名称的删除方法,属性要添加。
  2. manage.py makemigrations程序my_app
  3. manage.py迁移程序my_app
  4. 添加方法了。

11
投票

这是怎样的一个愚蠢的错误作出的,但其在模型类中的字段声明一行的末尾一个额外的逗号,使该行没有任何效果。

当你复制粘贴DEF它发生。从迁移,其本身被定义为一个阵列。

但也许这将帮助别人:-)


10
投票

也许我太晚了,但你尝试有migrations文件夹中的应用程序与它__init__.py文件?


7
投票

也许这将帮助别人。我使用的是嵌套应用。 project.appname居然和我有项目,并在project.appname INSTALLED_APPS。从INSTALLED_APPS删除项目允许检测的变化。


7
投票

答案是这个计算器后,通过cdvv7788 Migrations in Django 1.7

如果您正在迁移应用程序的第一次,你必须使用:

manage.py makemigrations myappname一旦你这样做,你可以这样做:

manage.py迁移如果你有在你的数据库应用程序,修改了模型及其不更新你可能还没有迁移它尚未makemigrations的变化。更改模型恢复到原来的形态,运行的第一个命令(应用程序名称)和迁移...这将假的。一旦你这样做放回变化对模型,运行makemigrations并再次迁移,它应该工作。

我有完全一样的麻烦和做上述完美。

我搬到我的Django应用CLOUD9出于某种原因,我从来没有抓到初始迁移。

© www.soinside.com 2019 - 2024. All rights reserved.