148

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

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

4

32 回答 32

193

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

python manage.py makemigrations your_app_label

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

于 2014-09-15T07:55:53.937 回答
67

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

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

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

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

*/migrations/*
!*/migrations/__init__.py
于 2017-09-22T10:39:47.807 回答
30

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

当升级到 1.7 时,我的模型变得不受管理(managed = False)——我像True以前一样拥有它们,但似乎它被恢复了。

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

于 2014-07-24T09:07:38.240 回答
21

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

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

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

./manage.py makemigrations my_app

其次是:

./manage.py migrate my_app

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

于 2015-01-23T06:47:33.450 回答
15

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

  1. 删除名称与您要添加的属性相似的方法。
  2. manage.py makemigrations my_app
  3. manage.py 迁移 my_app
  4. 重新添加方法。
于 2016-01-30T07:27:22.983 回答
13

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

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

虽然也许这会对某人有所帮助:-)

于 2015-10-12T13:19:29.993 回答
11

也许我为时已晚,但您是否尝试migrations在您的应用程序中创建一个包含__init__.py文件的文件夹?

于 2017-05-17T20:43:51.347 回答
7

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

于 2015-04-09T01:40:02.083 回答
7

答案在 Django 1.7 中的 cdvv7788 Migrations 的这篇 stackoverflow 帖子上

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

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

manage.py migrate 如果您的应用程序在数据库中,修改了它的模型并且它没有更新 makemigrations 上的更改,那么您可能还没有迁移它。将您的模型改回其原始形式,运行第一个命令(使用应用程序名称)并迁移......它会伪造它。完成后,将更改恢复到模型上,运行 makemigrations 并再次迁移,它应该可以工作。

我遇到了完全相同的麻烦,并且上述操作完美无缺。

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

于 2015-08-01T13:43:37.377 回答
7

以下为我工作:

  1. 将应用名称添加到 settings.py
  2. 使用'python manage.py makemigrations'
  3. 使用'python manage.py migrate'

为我工作:Python 3.4、Django 1.10

于 2016-10-26T06:34:07.630 回答
6

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

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

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

我希望这对将来的人有所帮助。

于 2015-12-09T00:36:52.330 回答
5

您要检查列表settings.py中的INSTALLED_APPS并确保其中列出了所有带有模型的应用程序。

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

于 2015-06-14T01:26:48.630 回答
5

以防万一您有一个未由 makemigrations 识别的特定字段:检查您是否有同名的属性。

例子:

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

# ... later

@property
def field(self):
    pass

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

于 2015-08-31T03:15:01.083 回答
5

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

我删除了migrations文件夹运行makemigrationsmigrate.
它仍然说:没有要申请的迁移。

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

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

于 2016-07-10T13:03:18.110 回答
5

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

于 2016-11-15T15:49:44.723 回答
3

schemamigration my_app --initial您在重命名旧迁移文件夹后使用了吗?尝试一下。可能会奏效。如果没有 - 尝试重新创建数据库并进行同步数据库迁移。它对我有用...

于 2014-07-23T14:23:55.700 回答
3

在我的情况下,我需要将我的模型添加到定义我的模型的模型文件夹的_init _.py 文件中:

from myapp.models.mymodel import MyModel
于 2020-07-22T04:47:04.680 回答
2

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

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()
于 2019-02-07T18:33:44.340 回答
1

我遇到了同样的问题,不得不两次运行 makemigrations 以及各种奇怪的行为。事实证明,问题的根源在于我使用了一个函数来在我的模型中设置默认日期,所以每次我运行 makemigrations 时,迁移都会检测到变化。这个问题的答案让我走上了正确的道路:避免 makemigrations to re-create date field

于 2014-12-11T20:21:18.200 回答
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.pymakemigrations,然后执行python manage.py migrate --fake-initial. 这就像一个魅力。一旦为所有应用程序创建了初始迁移并进行了假初始迁移,然后添加新模型并遵循makemigrations该应用程序的常规过程和迁移。现在检测到更改,一切正常。

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

于 2017-02-28T05:10:34.267 回答
1

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

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

我按照以下步骤操作:

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

如果您正在使用 Pycharm,本地历史非常有帮助。

于 2017-03-29T18:59:19.923 回答
1

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

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

记得删除*.pyc文件!

于 2017-05-11T11:32:31.623 回答
1
./manage makemigrations
./manage migrate

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

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

请记住:如果您的迁移以 IDE 中的 _001 和数据库中的 _003 结尾。Django 只会查看您是否有以 _004 结尾的迁移以进行任何更新。

2(代码和数据库迁移)链接并协同工作。

快乐编码。

于 2017-05-21T12:52:22.453 回答
1

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

python manage.py migrate --fake-initial
于 2019-08-15T13:04:48.350 回答
1
  1. 删除您要同步的更改。
  2. 运行 python manage.py makemigrations app_label 进行初始迁移。
  3. 在进行更改之前运行 python manage.py migrate 以创建表。
  4. 粘贴您在第一步中删除的更改。
  5. 运行 2. 和 3. 步骤
于 2020-06-08T18:29:12.543 回答
1

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

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

python manage.py makemigrations
python manage.py migrate
于 2021-11-26T13:33:36.260 回答
0

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

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

为了解决这个问题,我删除了我的models.py文件末尾的这个“空白行” ,我再次运行了命令,一切都得到了修复,并且检测到了对models.py所做的所有更改!

于 2018-02-04T16:21:26.713 回答
0

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

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

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

于 2020-05-11T18:52:33.497 回答
0

我遇到了这个问题,命令

python manage.py makemigrations

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

于 2021-01-18T13:48:58.690 回答
0

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

于 2021-09-23T06:20:09.753 回答
-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...线解决了问题!

于 2017-07-17T12:14:33.117 回答
-1

python manage.py makemigrations accounts 'accounts'的迁移:accounts\migrations\0001_initial.py - 创建模型 Customer - 创建模型标签 - 创建模型 Product - 创建模型 Order

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

于 2020-06-08T17:59:03.573 回答