【问题标题】:Django - makemigrations - No changes detectedDjango - makemigrations - 未检测到更改
【发布时间】:2016-07-09 07:15:23
【问题描述】:

我尝试使用 makemigrations 命令在现有应用中创建迁移,但它输出“未检测到更改”。

通常我使用startapp 命令创建新应用,但在创建此应用时并未使用它。

调试后,我发现它没有创建迁移,因为应用程序中缺少 migrations 包/文件夹。

如果文件夹不存在或者我遗漏了一些东西,如果它创建文件夹会更好吗?

【问题讨论】:

  • 您的应用是否已添加到 INSTALLED_APPS 中?
  • 是的,它是第一次在安装的应用程序中,最好使用makemigrations <myapp>,正如 Alasdair 指出的那样。
  • 删除'abstract = True' :)
  • 'makemigrations' 不起作用。 'makemigrations ' 工作
  • 我也遇到了同样的问题,是因为我忘记在app/admin.py注册模型了。

标签: python django django-migrations


【解决方案1】:

要为应用创建初始迁移,请运行 makemigrations 并指定应用名称。将创建迁移文件夹。

./manage.py makemigrations <myapp>

您的应用必须首先包含在 INSTALLED_APPS 中(在 settings.py 中)。

【讨论】:

  • 知道为什么他们 强迫我们指定应用程序吗?
  • @maazza 如果应用没有migrations 文件夹,则需要指定应用名称。如果您手动创建了应用程序,或者您从没有迁移的旧版本 Django 升级,则可能会发生这种情况。
  • @maazza 实际上你需要一个 python 包(带有__init__.py),在应用程序中命名为'migrations'。
  • 听起来像是 Django 应该自动处理的东西。
  • @duality_ this is by design - Django 不假定您需要为您的应用程序迁移。如果它为所有应用创建了迁移,则在您运行 migrate 时可能会导致错误。
【解决方案2】:

我的问题(以及解决方案)与上述问题不同。

我没有使用models.py 文件,而是创建了一个models 目录并在那里创建了my_model.py 文件,我将模型放在那里。 Django 找不到我的模型,所以它写道没有要应用的迁移。

我的解决方案是:在my_app/models/__init__.py 文件中我添加了这一行: from .my_model import MyModel

【讨论】:

  • 这恰好也是我的解决方案,但我不明白为什么会这样。有没有人对可能导致这种情况的原因有所了解?
  • Django 有一个默认路径来查找模型。如果项目结构不同,模型不在通常的地方,需要在那里导入。
  • @KarinaKlinkevičiūtė 如果我需要删除此类模型怎么办?
  • @DaniilMashkin 我想您还需要删除导入。这是构建项目的一种方式(不是唯一一种),如果您选择它,您必须处理随之而来的额外任务:)
  • 我对模型使用“经典”架构,然后迁移到“模型文件夹”架构,在现有模型上仍然检测到任何迁移。但是,现在,在创建 new 模型时,我遇到了这个问题。您的解决方案运行良好,但它让我的代码库有点不一致,因为有时有导入,有时没有。也许有更好的解决方案。我猜 Django 应该提出一个设置,其中包含在尝试查找新模型时要查找的文件夹列表。
【解决方案3】:

django 在makemigrations 命令期间未检测到要迁移的内容有多种可能的原因。

  1. 迁移文件夹您的应用中需要一个迁移包。
  2. INSTALLED_APPS您需要在INSTALLED_APPS .dict 中指定您的应用
  3. 详细程度首先运行makemigrations -v 3 来获取详细程度。这可能会对问题有所了解。
  4. 完整路径INSTALLED_APPS 中建议指定完整的模块应用配置路径“apply.apps.MyAppConfig”
  5. --settings 您可能需要确保设置了正确的设置文件:manage.py makemigrations --settings mysite.settings
  6. 指定应用名称明确地将应用名称放入 manage.py makemigrations myapp - 这样可以缩小应用的迁移范围并帮助您隔离问题。
  7. 模型元检查您的模型元中有正确的app_label

  8. 调试 django 调试 django 核心脚本。 makemigrations 命令非常简单。 Here's how to do it in pycharm。相应地更改您的脚本定义(例如:makemigrations --traceback myapp

多个数据库:

  • Db 路由器在使用 django db 路由器时,路由器类(您的自定义路由器类)需要实现 allow_syncdb 方法。

makemigrations 总是为模型更改创建迁移,但如果 allow_migrate() 返回 False,

【讨论】:

  • 涵盖了有关该问题的许多场景,应该是公认的答案。
  • 另一种可能性:正在导入错误的名称,即从表单而不是字段导入字段,或者从表单而不是模型导入模型。一个例子:from recurrence.forms import RecurrenceField,但它应该是from recurrence.fields import RecurrenceField
  • 还有一个原因。确保在网站的路线中使用模型(通过管理员或其他方式)。 “makemigrations 脚本查找从urls.py 连接的模型”。在这里找到stackoverflow.com/questions/43093651/…
  • cmd 示例:python manage.py makemigrations -v 3 &lt;app_name&gt;
  • 当我添加一个表,然后同时添加一个外键引用这个新表。它必须分为 2 个步骤: 前置步骤:将 INSTALLED_APPS 添加到设置中。 1)创建新表:python manage.py makemigrations ; 2)添加外键:python manage.py makemigrations
【解决方案4】:

我已经阅读了很多关于这个问题的答案,经常说只需以其他方式运行makemigrations。但对我来说,问题出在模型的 Meta 子类中。

我有一个应用配置,上面写着label = &lt;app name&gt;(在apps.py 文件中,在models.pyviews.py 等旁边)。如果您的元类没有与应用程序标签相同的标签(例如,因为您将一个太大的应用程序拆分为多个应用程序),则不会检测到任何更改(并且没有任何有用的错误消息)。所以在我的模型课中,我现在有:

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

在这里运行 Django 1.10。

【讨论】:

  • 如果您根本没有Meta 会怎样?那么它假设app_label 的默认值是多少?
【解决方案5】:

这里没有描述另一个问题,这让我发疯了。

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

我在一行中有一个尾随的“,”,可能来自复制和粘贴。 is_dumb 行没有使用“./manage.py makemigrations”创建模型迁移,但也没有引发错误。删除“,”后,它按预期工作。

所以复制粘贴时要小心:-)

【讨论】:

  • 结尾的逗号也可能导致其他地方的错误;逗号使语句成为元组,因此is_dumb 等于(models.BooleanField(default=False), ) 其中makemigrations 不知道如何转换为数据库列。
  • 这发生在我身上,如果它不知道该怎么做应该是一个警告
【解决方案6】:

这是一个评论,但可能应该是一个答案。

确保您的应用名称在 settings.py INSTALLED_APPS 中,否则无论您做什么,它都不会运行迁移。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

然后运行:

./manage.py makemigrations blog

【讨论】:

  • 但是当我们运行“manage.py migrate”命令时,它会将表名创建为“appname_modelname”
  • 查看model meta options更改表名
【解决方案7】:
  1. 确保在 settings.py 的 installed_apps 中提到了您的应用
  2. 确保您的模型类扩展了 models.Model

【讨论】:

    【解决方案8】:

    有时./manage.py makemigrations 优于./manage.py makemigrations &lt;myapp&gt;,因为它可以处理应用程序之间的某些冲突。

    那些场合无声无息地发生,需要几个小时的swearing 才能理解可怕的No changes detected 消息的真正含义。

    因此,使用以下命令是一个更好的选择:

    ./manage.py makemigrations &lt;myapp1&gt; &lt;myapp2&gt; ... &lt;myappN&gt;

    【讨论】:

      【解决方案9】:

      我的问题比上面的答案简单得多,而且只要您的项目已经设置好并且可以运行,这可能是一个更常见的原因。在我的一个运行了很长时间的应用程序中,迁移似乎很不稳定,所以我匆忙做了以下操作:

      rm -r */migrations/*
      rm db.sqlite3
      python3 manage.py makemigrations
      No changes detected
      

      什么??

      我还错误地删除了所有 __init__.py 文件 :( - 我进去后一切都恢复正常了:

      touch ads1/migrations/__init__.py
      

      对于我的每个应用程序,makemigrations 再次起作用。

      事实证明,我通过复制另一个应用程序手动创建了一个新应用程序,却忘记将 __init__.py 放在 migrations 文件夹中,这让我确信一切都很不稳定 - 导致我使用 rm -r 使情况变得更糟如上所述。

      希望这可以帮助某人在几个小时内对“未检测到更改”错误发誓。

      【讨论】:

        【解决方案10】:

        我从 django 外部复制了一个表,并且 Meta 类默认为“managed = false”。例如:

        class Rssemailsubscription(models.Model):
            id = models.CharField(primary_key=True, max_length=36)
            ...
            area = models.FloatField('Area (Sq. KM)', null=True)
        
            class Meta:
                managed = False
                db_table = 'RSSEmailSubscription'
        

        通过将managed 更改为Truemakemigrations 开始接受更改。

        【讨论】:

          【解决方案11】:

          另一个可能的原因是,如果您在另一个文件(而不是包)中定义了一些模型,并且没有在其他任何地方引用它。

          对我来说,只需将from .graph_model import * 添加到admin.py(其中graph_model.py 是新文件)即可解决问题。

          【讨论】:

            【解决方案12】:

            方法:1

            步骤:1

            确保您的应用必须包含在 settings.py 中的INSTALLED_APPS

            步数:2

            python manage.py makemigrations <appname>
            

            如果显示相同的消息(未检测到更改)

            !警告这对您的项目非常危险,因此请确保在应用方法 2 之前为您的项目备份。

            方法二

            重命名您的应用名称并使用:

            django-admin startapp <appname>
            

            从旧应用复制所有.py 文件except

            • 迁移文件夹
            • pycache 文件夹
            • 初始化.py
            • test.py 文件(如果您没有在其中编写代码)


            并粘贴到您最近制作的新应用中

            请记住,您必须为新应用使用完全相同的名称,否则您必须在项目中进行更多更改。

            【讨论】:

              【解决方案13】:

              这可能对其他人有所帮助,因为我最终花了几个小时试图追查这个问题。

              如果您的模型有一个同名的函数,这将删除该值。事后看来很明显,但尽管如此。

              所以,如果你有这样的事情:

              class Foobar(models.Model):
                  [...]
                  something = models.BooleanField(default=False)
              
                  [...]
                  def something(self):
                      return [some logic]
              

              在这种情况下,该函数将覆盖上述设置,使其对makemigrations“不可见”。

              【讨论】:

                【解决方案14】:

                您也可能遇到的一个非常愚蠢的问题是在您的模型中定义两个class Meta。在这种情况下,运行makemigrations 时不会应用对第一个更改的任何更改。

                class Product(models.Model):
                    somefield = models.CharField(max_length=255)
                    someotherfield = models.CharField(max_length=255)
                
                    class Meta:
                        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]
                
                    def somefunc(self):
                        pass
                
                    # Many lines...
                
                    class Meta:
                        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]
                

                【讨论】:

                  【解决方案15】:

                  向 django api 应用程序添加新模型并运行 python manage.py makemigrations 时,该工具未检测到任何新模型。

                  奇怪的是,旧模型确实被makemigrations 选中,但这是因为它们在urlpatterns 链中被引用,并且该工具以某种方式检测到它们。所以请留意这种行为。

                  问题是因为models包对应的目录结构有子包,所有__init__.py文件都是空的。他们必须在每个子文件夹和模型中 __init__.py 中显式导入所有必需的类,以便 Django 使用 makemigrations 工具提取它们。

                  models
                    ├── __init__.py          <--- empty
                    ├── patient
                    │   ├── __init__.py      <--- empty
                    │   ├── breed.py
                    │   └── ...
                    ├── timeline
                    │   ├── __init__.py      <-- empty
                    │   ├── event.py
                    │   └── ...
                  

                  【讨论】:

                    【解决方案16】:

                    我在创建一个名为 deals 的新应用程序时遇到了另一个问题。我想分离该应用程序中的模型,所以我有 2 个模型文件,分别名为 deals.pydealers.py。 运行 python manage.py makemigrations 时,我得到:No changes detected

                    我继续进入__init__.py,它位于我的模型文件(交易和经销商)所在的同一目录中

                    from .deals import *
                    from .dealers import *
                    

                    然后makemigrations 命令起作用了。

                    事实证明,如果您没有在任何地方导入模型,或者您的模型文件名不是models.py,则不会检测到模型。

                    发生在我身上的另一个问题是我在settings.py 中编写应用程序的方式:

                    我有:

                    apps.deals
                    

                    它应该包括根项目文件夹:

                    cars.apps.deals
                    

                    【讨论】:

                      【解决方案17】:

                      我通过这样做解决了这个问题:

                      1. 擦除“db.sqlite3”文件。 问题是您当前的数据库将被删除,因此您必须重新制作它。
                      2. 在您编辑的应用程序的迁移文件夹中,删除最后更新的文件。请记住,第一个创建的文件是:“0001_initial.py”。例如:我创建了一个新类并通过“makemigrations”和“migrate”程序注册它,现在创建了一个名为“0002_auto_etc.py”的新文件;擦掉它。
                      3. 转到“pycache”文件夹(在迁移文件夹内)并删除文件“0002_auto_etc.pyc”。
                      4. 最后,进入控制台并使用“python manage.py makemigrations”和“python manage.py migrate”。

                      【讨论】:

                        【解决方案18】:

                        我知道这是一个老问题,但我整天都在为同样的问题而奋斗,我的解决方案很简单。

                        我的目录结构类似于...

                        apps/
                           app/
                              __init__.py
                              app_sub1/
                                   __init__.py
                                   models.py
                              app_sub2/
                                   __init__.py
                                   models.py
                              app_sub3/
                                   __init__.py
                                   models.py
                           app2/
                              __init__.py
                              app2_sub1/
                                   __init__.py
                                   models.py
                              app2_sub2/
                                   __init__.py
                                   models.py
                              app2_sub3/
                                   __init__.py
                                   models.py
                            main_app/
                              __init__.py
                              models.py
                        

                        并且由于直到我遇到问题的所有其他模型都被导入其他地方,最终从main_app 导入,该main_appINSTALLED_APPS 中注册,所以我很幸运它们都能正常工作。

                        但是由于我只添加了每个appINSTALLED_APPS 而不是app_sub*,当我最终添加了一个没有在其他任何地方导入的新模型文件时,Django 完全忽略了它。

                        我的解决方法是像这样将models.py 文件添加到每个app 的基本目录中......

                        apps/
                           app/
                              __init__.py
                              models.py <<<<<<<<<<--------------------------
                              app_sub1/
                                   __init__.py
                                   models.py
                              app_sub2/
                                   __init__.py
                                   models.py
                              app_sub3/
                                   __init__.py
                                   models.py
                           app2/
                              __init__.py
                              models.py <<<<<<<<<<--------------------------
                              app2_sub1/
                                   __init__.py
                                   models.py
                              app2_sub2/
                                   __init__.py
                                   models.py
                              app2_sub3/
                                   __init__.py
                                   models.py
                            main_app/
                              __init__.py
                              models.py
                        

                        然后将from apps.app.app_sub1 import * 等添加到每个app 级别的models.py 文件中。

                        Bleh...这花了我很长时间才弄清楚,我在任何地方都找不到解决方案...我什至去了谷歌搜索结果的第 2 页。

                        希望这对某人有所帮助!

                        【讨论】:

                          【解决方案19】:

                          我忘了输入正确的论点:

                          class LineInOffice(models.Model):   # here
                              addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
                              ...
                          

                          在models.py中 然后它开始摆脱那种烦人的感觉

                          在应用“myApp”中未检测到更改

                          【讨论】:

                            【解决方案20】:

                            在我的例子中,我忘记插入类参数

                            错误:

                            class AccountInformation():
                            

                            正确

                            class AccountInformation(models.Model):
                            

                            【讨论】:

                            • 这对我有用。我认为这取决于python版本。
                            【解决方案21】:
                            INSTALLED_APPS = [
                            
                                'blog.apps.BlogConfig',
                                'django.contrib.admin',
                                'django.contrib.auth',
                                'django.contrib.contenttypes',
                                'django.contrib.sessions',
                                'django.contrib.messages',
                                'django.contrib.staticfiles',
                            
                            ]
                            

                            确保“blog.apps.BlogConfig”(这包含在您的 settings.py 中,以便进行应用迁移)

                            然后运行 ​​python3 manage.py makemigrations blog 或您的应用名称

                            【讨论】:

                              【解决方案22】:

                              这可以通过使用下面提到的两个步骤来完成。

                              1. 将您的应用添加到settings.py > INSTALLED_APPS
                              2. 打开 admin.py
                              
                              from .models import upImg
                              # Register your models here.
                              admin.site.register(upImg)
                              
                              

                              注意:将 upImg 替换为您在 models.py 中定义的类名

                              之后看看是否还有python manage.py makemigrations。如果有,也执行python manage.py migrate

                              更多信息请关注django tutorial

                              【讨论】:

                                【解决方案23】:

                                解决方案是您必须将您的应用程序包含在 INSTALLED_APPS 中。

                                我错过了,我发现了同样的问题。

                                指定我的应用名称迁移成功后

                                INSTALLED_APPS = [
                                    'django.contrib.admin',
                                    'django.contrib.auth',
                                    'django.contrib.contenttypes',
                                    'django.contrib.sessions',
                                    'django.contrib.messages',
                                    'django.contrib.staticfiles',
                                    'boards',
                                ]
                                

                                请注意我在最后提到的板,这是我的应用名称。

                                【讨论】:

                                  【解决方案24】:

                                  另一个极端情况和解决方案:

                                  我添加了一个布尔字段,同时添加了一个引用它的@property,具有相同的名称(doh)。评论属性和迁移看到并添加新字段。重命名该属性,一切正常。

                                  【讨论】:

                                    【解决方案25】:

                                    尝试在 admin.py 中注册您的模型,这是一个示例:- admin.site.register(YourModelHere)

                                    您可以执行以下操作:- 1. admin.site.register(YourModelHere) # 在 admin.py 2.重新加载页面并重试 3. 按 CTRL-S 并保存 4.可能有错误,特别检查models.py和admin.py 5. 或者,最后重启服务器

                                    【讨论】:

                                      【解决方案26】:

                                      根据official documentation 中的迁移部分,我在 django 3.0 上遇到了类似的问题,运行它足以更新我的表结构:

                                      python manage.py makemigrations
                                      python manage.py migrate
                                      

                                      但输出始终相同:在我执行“makemigrations”脚本后,我的模型“没有检测到变化”。 我想在 db 上更新的模型上的 models.py 出现语法错误:

                                      field_model : models.CharField(max_length=255, ...)
                                      

                                      代替:

                                      field_model = models.CharField(max_length=255, ...)
                                      

                                      解决了这个愚蠢的错误,使用这些命令可以顺利完成迁移。也许这对某人有帮助。

                                      【讨论】:

                                      • 我觉得当你有一个混乱的模型时,Django 应该给出更多警告。这也解决了我的问题。
                                      【解决方案27】:

                                      您应该在setting.py 中将polls.apps.PollsConfig 添加到INSTALLED_APPS

                                      【讨论】:

                                        【解决方案28】:

                                        可能的原因可能是删除了现有的 db 文件和迁移文件夹 您可以使用 python manage.py makemigrations &lt;app_name&gt; 这应该可以。我曾经遇到过类似的问题。

                                        【讨论】:

                                          【解决方案29】:

                                          如果您的模型 Meta 中有 managed = True,则需要将其删除并进行迁移。然后再次运行迁移,它将检测到新的更新。

                                          【讨论】:

                                            【解决方案30】:

                                            我对这个错误的问题是我包含了:

                                            class Meta:
                                               abstract = True
                                            

                                            我要为其创建迁移的内部模型。

                                            【讨论】:

                                              猜你喜欢
                                              • 2014-09-14
                                              • 2016-06-19
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2021-05-09
                                              • 2019-11-01
                                              • 2021-02-07
                                              相关资源
                                              最近更新 更多