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

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

通常我使用startapp命令创建新应用程序,但在创建这个应用程序时没有使用它。

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

如果文件夹不存在或者我遗漏了什么,如果它创建文件夹会更好吗?

231840 次浏览

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

./manage.py makemigrations <myapp>

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

更新:在尝试之前,应该确保__init__.py文件存在于migrations文件夹中:

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


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

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

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

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

我读过很多关于这个问题的答案,通常都是简单地以其他方式运行makemigrations。但对我来说,问题是在模型的Meta子类。

我有一个应用程序配置,说label = <app name>(在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。

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

确保你的应用程序名称在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

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

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

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

django在执行makemigrations命令时没有检测到要迁移的内容有多种可能的原因。

  1. 你的应用程序中需要一个迁移包。
  2. 你需要在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核心脚本。Makemigrations命令相当直截了当。以下是如何在pycharm中做到这一点。相应地更改脚本定义(例如:makemigrations --traceback myapp)

多个数据库:

  • 当使用django db router时,router类(你的自定义router类)需要实现allow_syncdb方法。

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

我从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开始拾取更改。

另一个会导致这种情况的是字段后面的尾随逗号,这将导致在makemigrationations期间跳过字段:

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的模型迁移,因为Python认为它是一个元组,而Django不认为它是一个字段。

解决方案是你必须把你的应用包含在INSTALLED_APPS中。

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

在指定我的应用程序名称迁移成功

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

请注意,我在最后提到了boards,这是我的应用程序名称。

我这样解决了这个问题:

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

你应该在setting.py中的INSTALLED_APPS中添加polls.apps.PollsConfig

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 makemigrationblog或你的应用程序名

还有一个非常愚蠢的问题是在你的模型中定义两个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")]

我知道这是一个老问题,但我一整天都在和这个问题斗争,我的解决方法很简单。

我的目录结构是这样的……

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导入,这是在INSTALLED_APPS中注册的,我只是很幸运,它们都工作了。

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

我的修复是在每个app的基目录中添加一个models.py文件,就像这样…

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文件中。

在那里……我花了很长时间才弄明白,我在任何地方都找不到解决方案……我甚至翻到了谷歌结果的第二页。

希望这能帮助到一些人!

  1. 确保你的应用在settings.py中的installed_apps中被提及
  2. 确保建模类扩展了模型。模型
首先,确保你的应用已经在settings .py中的Installed_app中注册了 那么上面的答案完全正确

我忘记写正确的论点了

class LineInOffice(models.Model):   # here
addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
...
在models.py < p > 然后它开始下降烦人的

在应用程序“myApp”中未检测到任何变化

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

对我来说,简单地将from .graph_model import *添加到admin.py(其中graph_model.py是新文件)就解决了这个问题。

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

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

Whaat ? ?

我还错误地删除了所有__init__.py文件:(-一切都在工作后,我进入和:

touch ads1/migrations/__init__.py

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

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

希望这能帮助一些人在“未检测到更改”的错误中咒骂几个小时。

在我的情况下,我忘记插入类参数

错误的:

class AccountInformation():

正确的

class AccountInformation(models.Model):
可能的原因是删除了现有的db文件和migrations文件夹 你可以使用python manage.py makemigrations <app_name>,这应该可以工作。

.我曾经遇到过类似的问题

还有一个边缘情况和解决方案:

我添加了一个布尔字段,同时添加了一个@属性引用它,具有相同的名称(doh)。注释属性和迁移看到并添加新字段。重新命名财产,一切都很好。

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

当向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
│   └── ...

好吧,我相信你还没有设置模型,那么它现在迁移了什么?

所以解决方案是设置所有变量和设置Charfield, Textfield.......然后迁移它们,就会成功。

我在创建一个名为deals的新应用程序时遇到了不同的问题。我想在应用程序中分离模型,所以我有两个模型文件,分别命名为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
试着在admin.py中注册你的模型,这里有一个例子 admin.site.register (YourModelHere) < / p >

您可以做以下事情:- 1. admin.site.register(YourModelHere) # 2. 重新加载页面并重试 3.点击CTRL-S并保存 4. 可能有错误,特别检查models.py和admin.py 5. 或者,在结束时重新启动服务器

我在django 3.0中遇到了类似的问题,根据官方文档中的迁移部分,运行这足以更新我的表结构:

python manage.py makemigrations
python manage.py migrate
但是输出总是相同的:在我执行'makemigrations'脚本后,我的模型'未检测到变化'。 我在models.py的模型上有一个语法错误,我想在db上更新:

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

而不是:

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

解决了这个愚蠢的错误,有了这些命令,迁移就没有问题了。也许这能帮到别人。

这可能会帮助其他人,因为我最终花了几个小时试图追踪它。

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

所以,如果你有这样的东西:

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


[...]
def something(self):
return [some logic]

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

你能做的最好的事情是,删除现有的数据库。在我的情况下,我使用phpMyAdmin SQL数据库,所以我手动删除创建的数据库在那里。

< >强后删除: 我在PhpMyAdmin中创建数据库,不添加任何表

再次执行以下命令:

python manage.py makemigrations

python manage.py migrate

这些命令之后:你可以看到django已经在数据库中自动创建了其他必要的表(大约有10个表)。

python manage.py makemigrations <app_name>

python manage.py migrate

最后:在以上命令之后,你创建的所有模型(表)都直接导入到数据库中。

希望这能有所帮助。

对于这个错误,我的问题在于我包含了:

class Meta:
abstract = True

里面的模型,我想创建迁移。

另一种可能是你压缩了一些迁移并应用了结果迁移,但忘记从中删除replaces属性。

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

  1. 将你的应用程序添加到settings.py >INSTALLED_APPS
  2. 打开admin.py

from .models import upImg
# Register your models here.
admin.site.register(upImg)


注意:用你在models.py中定义的className替换upImg

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

更多信息请参考django教程

操作方法:

1 . < br >

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

步骤:2 < br >

python manage.py makemigrations <appname>

如果同样的消息显示(No changes detected)

这对你的项目来说是非常危险的,所以在应用这个方法之前,请确保你的项目有备份。

方法2

重命名您的应用程序名称,并使用:

django-admin startapp <appname>

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

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


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

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

很简单,你需要在空的migrations文件夹中添加空的初始化.py。 然后使用" python manage.py makemigrations"

检查迁移

目录结构,

    <李>应用程序
      <李>迁移
      • 初始化.py

我有一个属性与我试图用makemigrations添加的字段具有相同的名称。