Django 1.9 - makemigrations - 未检测到任何更改

Dil*_*raj 101 python django django-migrations

使用现有应用程序,我尝试使用makemigrations命令创建迁移,但它显示"未检测到任何更改".

通常我使用startapp命令创建新的应用程序但这个特定的应用程序不是.

经过一段时间的调试后,我发现它没有创建迁移,因为migrations应用程序中缺少包/文件夹.

如果不存在或者我错过了某些东西,它会更好地创建文件夹

Ala*_*air 204

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

./manage.py makemigrations <myapp>
Run Code Online (Sandbox Code Playgroud)

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

  • @maazza如果应用程序没有`migrations`文件夹,则需要指定应用程序名称.如果您手动创建应用程序,或者您从没有迁移的旧版Django升级,则可能会发生这种情况. (29认同)
  • Any idea why they <sometimes> force us to specify the app ? (9认同)
  • @maazza实际上你需要一个在应用程序中名为'migrations'的python包(带有`__init __.py`). (6认同)
  • @duality_ 这[是设计使然](https://docs.djangoproject.com/en/2.0/topics/migrations/#adding-migrations-to-apps) - Django 不会假设您想要为您的应用程序进行迁移。如果它为所有应用程序创建了迁移,则在运行“migrate”时可能会导致错误。 (6认同)
  • 听起来像是 Django 应该自动处理的事情。 (3认同)
  • 这个问题导致我花了两天时间进行调试,而您的答案只是解决了我的问题,我只是错误地认为 makemigrations 将自动应用于所有已安装的应用程序。 (2认同)

Kar*_*ūtė 32

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

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

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

  • 我对模型使用了“经典”架构,然后迁移到“模型文件夹”架构,并且仍然在我的现有模型上检测到任何迁移。但是,现在,在创建*新*模型时,我遇到了这个问题。您的解决方案运行良好,但它让我的代码库有点不一致,因为有时有导入,有时没有导入。也许有更好的解决方案。我想 Django 应该提出一个设置,其中包含在尝试查找新模型时要查找的文件夹列表。 (3认同)
  • Django 有一个默认的模型路径。如果项目结构不同,并且模型不在通常的位置,则需要将它们导入到那里。 (2认同)

小智 30

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

  1. 迁移文件夹您的应用程序中需要迁移包.
  2. INSTALLED_APPS您需要在INSTALLED_APPS.dict中指定您的应用程序
  3. 详细程度 始于makemigrations -v 3争取冗长.这可能会对这个问题有所了解.
  4. 完整路径INSTALLED_APPS建议指定完整模块应用程序配置路径'apply.apps.MyAppConfig'
  5. -您可能希望确保设置正确的设置文件:manage.py makemigrations --settings mysite.settings
  6. 指定应用程序名称明确地将应用程序名称放入manage.py makemigrations myapp- 这会缩小应用程序的迁移范围,并帮助您隔离问题.
  7. 模型元检查你app_label在模型元中有权利

  8. 调试django调试django核心脚本.makemigrations命令非常简单.以下是如何在pycharm中执行此操作.相应地改变你的脚本定义(例如:makemigrations --traceback myapp)

多个数据库:

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

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

  • 涵盖了许多关于该问题的场景,应该是公认的答案。 (2认同)

one*_*sec 26

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

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

class ModelClassName(models.Model):

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

    field_name = models.FloatField()
    ...
Run Code Online (Sandbox Code Playgroud)

在这里运行Django 1.10.


Sus*_*tri 14

方法:1

步骤1

确保您的应用程序必须包含在INSTALLED_APPSsettings.py 中

步骤:2

python manage.py makemigrations <appname>
Run Code Online (Sandbox Code Playgroud)

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

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

方法二

重命名您的应用程序名称并使用以下命令创建新应用程序:

django-admin startapp <appname>
Run Code Online (Sandbox Code Playgroud)

复制旧应用程序中的所有.py文件except

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


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

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


sur*_*190 12

这是一个评论,但应该是一个答案.

确保您的应用名称在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',
]
Run Code Online (Sandbox Code Playgroud)

然后运行:

./manage.py makemigrations blog
Run Code Online (Sandbox Code Playgroud)


Ama*_*ngh 9

  1. 确保在 settings.py 中的 installed_apps 中提到了您的应用
  2. 确保您的模型类扩展了 models.Model


rar*_*iru 8

有时./manage.py makemigrations优势是./manage.py makemigrations <myapp>因为它可以处理应用程序之间的某些冲突.

这些场合是默默无闻的,需要几个小时swearing才能理解可怕No changes detected消息的真正含义.

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

./manage.py makemigrations <myapp1> <myapp2> ... <myappN>


Nic*_*ian 7

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

对我来说,只需添加from .graph_model import *admin.pygraph_model.py文件在哪里)就可以解决问题。


drc*_*uck 7

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

rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected
Run Code Online (Sandbox Code Playgroud)

什么??

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

touch ads1/migrations/__init__.py
Run Code Online (Sandbox Code Playgroud)

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

事实证明,我已经手动通过复制另一个创建了一个新的应用程序,忘了把__init__.pymigrations文件夹和confinved我,一切都是靠不住的-我的领导让情况变得更糟与rm -r如上所述。

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


yve*_*ess 6

我还有另一个这里未描述的问题,这让我发疯。

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
Run Code Online (Sandbox Code Playgroud)

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

因此,在复制粘贴时请多加注意:-)

  • 尾随的逗号也可能在其他地方引起错误;逗号使语句成为一个元组,因此 `is_dumb` 等于 `(models.BooleanField(default=False), )`,而 `makemigrations` 不知道如何转换为数据库列。 (2认同)

Dan*_*ell 5

我从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'
Run Code Online (Sandbox Code Playgroud)

通过将manged更改为True,makemigrations开始接受更改。


ato*_*edo 5

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

\n\n

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

\n\n

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

\n\n
models\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py          <--- empty\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 patient\n  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py      <--- empty\n  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 breed.py\n  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 timeline\n  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py      <-- empty\n  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 event.py\n  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n
Run Code Online (Sandbox Code Playgroud)\n


vpe*_*son 5

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

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

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

class Foobar(models.Model):
    [...]
    something = models.BooleanField(default=False)

    [...]
    def something(self):
        return [some logic]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该函数将覆盖上面的设置,使其对makemigrations.