ChatGPT解决这个技术问题 Extra ChatGPT

Django 1.7 - makemigrations 未检测到更改

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

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

提供的解决方案对我不起作用,所以如果有人遇到同样的问题,这就是我的解决方案! 1. 删除所有应用下的迁移文件 2. 删除数据库并重新创建 3. 运行 makemigrations 和迁移命令 PS 先尝试第 1 步和第 3 步。如果仍有错误,请执行步骤 1-3。

d
drojf

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

python manage.py makemigrations your_app_label

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


对于来自 Django 1.6 的人来说,答案很好!谢谢!
如果我有多个应用程序怎么办?我应该为每个python manage.py makemigrations APP_LABEL吗?
在此处的 Django 1.9 下,我的应用程序是使用 ./manage.py startapp 创建的,但我仍然必须明确提及标签
M
Mohammed Shareef C

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

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

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

迁移文件应该包含在 repo 中。 read here。如果您的团队经常遇到迁移问题,您可以考虑忽略迁移文件,如下所示:

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

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

请记住,不建议按照 django 文档 gitignore 迁移文件


我已经克隆了我的项目,并且没有将迁移文件夹推送到存储库,所以我必须添加迁移总监,然后我添加了 init.py 并且我能够进行迁移。谢谢你
我删除了 /migrations 文件夹的内容以“重置”我尚未部署的项目的内容。我无意中删除了 __init__.py 文件夹以及迁移。
这为我做到了.... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).. 它是由将文件添加到 .gitignore 引起的
为什么 init.py 文件在迁移文件夹中如此重要?进行迁移?我在哪里可以更深入地了解这个逻辑?
@NimishBansal 直到 python 3.3 __init__.py 文件需要在目录中才能将其视为 python 包。 see this
T
TyrantWave

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

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

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


请澄清-您在哪里更改/添加了“managed = False”?我有同样的问题
我没有那个代码了,但如果我没记错的话,我认为它是类的一个属性。
好点子。请注意,manage.py inspectdb 添加了 manage=False!如果您导入遗留数据库,您必须仔细调整它!
@TyrantWave,你拯救了我的一天。非常感谢。
确保您的 app_label 相同
G
Grant Eagon

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

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

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

./manage.py makemigrations my_app

其次是:

./manage.py migrate my_app

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


仅供参考:他在这里说,“文件以及数据库记录。” 如果您删除数据库记录但不删除文件(除了 __init.py__,它不会工作。
P
Prashant Nair

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

删除名称与您要添加的属性相似的方法。 manage.py makemigrations my_app manage.py migrate my_app 添加方法。


M
MrE

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

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

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


您的评论帮助我找到了我的问题!我在选项列表中最后一个选项的末尾没有逗号。显然 Django 非常敏感。
@Maxim:这不太可能是您的问题的原因:末尾没有逗号的列表仍然是列表。另一件事是元组:如果元组中只有一个元素,则在它后面需要一个逗号。
老兄为我节省了很多时间! @dangonfast:在模型定义中,这确实是一个问题。
A
Alessandro

也许我来得太晚了,但您是否尝试在您的应用程序中有一个 migrations 文件夹,其中包含一个 __init__.py 文件?


如果你有这个“makemigrations”将为应用程序创建迁移。否则它将需要您运行 makemigrations app_name (创建这些文件)
j
jaywhy13

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


C
Community

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

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

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

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


P
Pranshu Gupta

以下为我工作:

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

为我工作:Python 3.4、Django 1.10


D
Deniz Kaplan

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

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

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

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


S
Sticky

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

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


f
furins

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

例子:

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

# ... later

@property
def field(self):
    pass

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


一个相关的问题是有一个格式错误的字段仍然无法验证/检查。我定义了 hourly_rate = models.DecimalField(缺少尾随的 '()'),它只是默默地失败了。
J
Jithin Pavithran

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

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

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

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


太感谢了!这有助于
M
Mark

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


A
Alex Vidis

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


不存在命令 schemamigration - 我认为这是 South 的一部分?我目前根本没有迁移文件夹。删除我的 models.py 并重新运行 inspectdb 似乎没有任何作用。
schemamigration 来自南方。 makemigrations 是它的替代品。
这仍然有效。但它更改为 makemigrations --empty
r
robert wallace

就我而言,我需要将模型添加到定义模型的模型文件夹的 _init_.py 文件中:

from myapp.models.mymodel import MyModel

S
Sonu Kumar

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

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

W
Walk

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

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

python manage.py makemigrations
python manage.py migrate

P
PhoebeB

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


J
Jeru Luke

我最近将 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,然后执行 {2 }。这就像一个魅力。一旦为所有应用创建了初始迁移并进行了假初始迁移,然后添加新模型并遵循 makemigrations 的常规过程并在该应用上迁移。现在检测到更改,一切正常。

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


f
fingerprints

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

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

我按照以下步骤操作:

我制作了 .\manage.py makemigrations 应用程序我执行了 .\manage.py 迁移我删除了我的模型的两个表。py 我从序列化程序和视图类中删除了对我的表的所有引用。我执行了第 1 步和第 2 步。我在再次执行第 5 步的 models.py 中检索了我的更改。我恢复了所有更改。

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


S
Sebastian Wagner

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

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

记得删除 *.pyc 个文件!


A
A H Bensiali
./manage makemigrations
./manage migrate

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

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

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

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

快乐编码。


d
dtar

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

python manage.py migrate --fake-initial

V
Vijay Choudhary

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


A
Art_Code

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

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

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


我相信在 django 2.0 + 中需要空行,我不得不做与你做的相反的事情,伙计
@SumitKumarSaha 哈哈,我目前使用的是 Django 1.7 版本,而那个空白行是 2 小时尝试一切解决迁移错误的原因。感谢分享苏米特。祝你今天过得愉快
R
Rishabh Aher

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

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

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


佚名

我遇到了这个问题,命令

python manage.py makemigrations

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


c
chandradeep kumar

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


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
这是一个相关案例。对于我们声明由 django 识别的模型,我们需要以某种方式在某个地方使用它

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅