【问题标题】:Django 1.7 - makemigrations not detecting changesDjango 1.7 - makemigrations 未检测到更改
【发布时间】:2014-09-14 17:41:30
【问题描述】:

正如标题所说,我似乎无法进行迁移。

该应用程序最初版本低于 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 和迁移命令 P.S.首先尝试第 1 步和第 3 步。如果仍有错误,请执行步骤 1-3。

标签: python django django-1.7 django-migrations


【解决方案1】:

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

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

python manage.py makemigrations
python manage.py migrate

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    我也遇到过这个问题,命令

    python manage.py makemigrations
    

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

    【讨论】:

      【解决方案4】:

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

      from myapp.models.mymodel import MyModel
      

      【讨论】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

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

              python manage.py migrate --fake-initial
              

              【讨论】:

                【解决方案9】:

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

                1. 您没有在 settings.pyINSTALLED_APPS 列表中添加应用 (您必须在 app 文件夹中的 apps.py 中添加 应用名称 或虚线路径到 AppConfig 的子类,具体取决于您使用的 django 版本)。参考文档: 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 文件来 gitignore 迁移文件

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

                【讨论】:

                • 我已经克隆了我的项目并且迁移文件夹没有被推送到仓库所以我必须添加迁移总监然后我添加了 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 Till python 3.3 __init__.py 在目录中需要文件才能将其视为 python 包。 see this
                【解决方案10】:

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

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                  • 如果你有这个“makemigrations”将为应用程序创建迁移。否则它将要求您运行 makemigrations app_name (创建这些文件)
                  【解决方案12】:

                  添加此答案是因为上面没有其他可用的答案对我有用。

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

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

                  【讨论】:

                  • 我相信在 django 2.0 + 中需要空行,我不得不做与你做的相反的事情,伙计
                  • @SumitKumarSaha 哈哈我目前使用的是 Django 1.7 版本,而该空白行是 2 小时尝试一切解决迁移错误的原因。感谢分享苏米特。祝你有美好的一天
                  【解决方案13】:

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

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

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

                  【讨论】:

                  • 您的评论帮助我找到了我的问题!我在选项列表中最后一个选项的末尾没有逗号。显然 Django 非常敏感。
                  • @Maxim:这不太可能是您的问题的原因:末尾没有逗号的列表仍然是一个列表。另一个问题是元组:如果元组中只有一个元素,则需要在其后加逗号。
                  • 这帮我节省了很多时间! @dangonfast:在模型定义中,确实是个问题。
                  【解决方案14】:

                  添加我的 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... 行解决了问题!

                  【讨论】:

                    【解决方案15】:
                    ./manage makemigrations
                    ./manage migrate
                    

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

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

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

                    这 2 个(代码和数据库迁移)相互关联并协同工作。

                    编码愉快。

                    【讨论】:

                      【解决方案16】:

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

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

                      记得删除*.pyc文件!

                      【讨论】:

                        【解决方案17】:

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

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

                        我按照以下步骤操作:

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

                        如果您使用 Pycharm,本地历史记录非常有用。

                        【讨论】:

                          【解决方案18】:

                          我最近将 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 的南),它可能会帮助他们:)

                          【讨论】:

                            【解决方案19】:

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

                            【讨论】:

                              【解决方案20】:

                              以下对我有用:

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

                              为我工作:Python 3.4、Django 1.10

                              【讨论】:

                                【解决方案21】:

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

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

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

                                这基本上是手动编辑迁移文件。
                                只有在您了解文件内容的情况下才能这样做。

                                【讨论】:

                                • 非常感谢!这有帮助
                                【解决方案22】:

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

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

                                【讨论】:

                                  【解决方案23】:

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

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

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

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

                                  【讨论】:

                                    【解决方案24】:

                                    以防万一您有一个无法被 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(缺少结尾的'()'),它只是默默地失败了。
                                    【解决方案25】:

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

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

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

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

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

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

                                    【讨论】:

                                      【解决方案26】:

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

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

                                      【讨论】:

                                        【解决方案27】:

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

                                        【讨论】:

                                          【解决方案28】:

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

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

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

                                          ./manage.py makemigrations my_app

                                          接着是:

                                          ./manage.py migrate my_app

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

                                          【讨论】:

                                          • 仅供参考:他在这里说的关键是,“文件以及数据库记录。” 如果您删除数据库记录但不删除文件(除了对于__init.py__,它将不起作用。
                                          【解决方案29】:

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

                                          【讨论】:

                                            【解决方案30】:

                                            如果您要从您在 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 创建的,但我仍然必须明确提及标签
                                            猜你喜欢
                                            • 1970-01-01
                                            • 2016-07-09
                                            • 2016-06-19
                                            • 1970-01-01
                                            • 2021-05-09
                                            • 2019-11-01
                                            • 2021-02-07
                                            相关资源
                                            最近更新 更多