Django - makemigrations - 未检测到任何更改
Django - makemigrations - No changes detected
我试图使用 makemigrations 命令在现有应用程序中创建迁移,但它输出 "No changes detected"。
通常我使用 startapp
命令创建新应用程序,但在创建它时并未将其用于此应用程序。
调试后,我发现它没有创建迁移,因为应用程序缺少migrations
package/folder。
如果文件夹不存在或者我遗漏了什么,如果它创建该文件夹会更好吗?
要为应用程序创建初始迁移,运行 makemigrations
并指定应用程序名称。将创建迁移文件夹。
./manage.py makemigrations <myapp>
您的应用必须首先包含在 INSTALLED_APPS
中(在 settings.py 中)。
有时 ./manage.py makemigrations
优于 ./manage.py makemigrations <myapp>
因为它可以处理应用程序之间的某些冲突。
这些情况悄无声息地发生,需要几个小时 swearing
才能理解可怕的 No changes detected
消息的真正含义。
因此,使用以下命令是更好的选择:
./manage.py makemigrations <myapp1> <myapp2> ... <myappN>
我读过许多关于这个问题的答案,通常以其他方式简单地说明 运行 makemigrations
。但对我来说,问题出在模型的 Meta
子 class 中。
我有一个显示 label = <app name>
的应用程序配置(在 apps.py
文件中,在 models.py
、views.py
等旁边)。如果你的 meta class 没有与应用程序标签相同的标签(例如,因为你将一个太大的应用程序拆分为多个),则不会检测到任何更改(也没有任何有用的错误消息) .所以在我的模型中 class 我现在有:
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
django 在 makemigrations
命令期间未检测到要迁移的内容有多种可能的原因。
- 迁移文件夹您的应用程序中需要一个迁移包。
- INSTALLED_APPS 您需要在
INSTALLED_APPS
.dict 中指定您的应用
- 冗长 以 运行
makemigrations -v 3
开始冗长。这可能会阐明问题。
- 完整路径 在
INSTALLED_APPS
中建议指定完整的模块app配置路径'apply.apps.MyAppConfig'
- --settings 您可能需要确保设置了正确的设置文件:
manage.py makemigrations --settings mysite.settings
- 指定应用程序名称 明确将应用程序名称放入
manage.py makemigrations myapp
- 单独缩小应用程序的迁移范围并且帮助您隔离问题。
model meta 检查你的模型 meta
是否正确 app_label
调试 django 调试 django 核心脚本。 makemigrations 命令非常简单。 Here's how to do it in pycharm。相应地更改您的脚本定义(例如:makemigrations --traceback myapp
)
多个数据库:
- Db Router 使用 django db router 时,路由器 class(您的自定义路由器 class)需要实现
allow_syncdb
方法。
makemigrations always creates migrations for model changes, but if
allow_migrate() returns False,
我从 django 外部复制了一个 table 并且 Meta class 默认为“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
更改为 True
,makemigrations
开始进行更改。
我遇到了这里没有描述的另一个问题,这让我抓狂。
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' 的模型迁移,但也没有抛出错误。删除 ',' 后,它按预期工作。
所以复制和粘贴时要小心 :-)
解决方案是您必须将您的应用包含在 INSTALLED_APPS 中。
我错过了,我发现了同样的问题。
指定我的应用名称后迁移成功
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boards',
]
请注意我在最后提到了 boards,这是我的应用名称。
我通过这样做解决了这个问题:
- 删除 "db.sqlite3" 文件。 这里的问题是你当前的数据库会被清空,所以你需要重新制作。
- 在您编辑的应用程序的迁移文件夹中,删除最后更新的文件。请记住,第一个创建的文件是:“0001_initial.py”。例如:我新建了一个class并通过"makemigrations"和"migrate"程序注册了它,现在创建了一个名为“0002_auto_etc.py”的新文件;删除它。
- 转到“pycache”文件夹(在迁移文件夹内)并删除文件“0002_auto_etc.pyc”。
- 最后,转到控制台并使用 "python manage.py makemigrations" 和 "python manage.py migrate"。
您应该在 setting.py
中将 polls.apps.PollsConfig
添加到 INSTALLED_APPS
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 博客或您的应用名称
您可能遇到的一个非常愚蠢的问题是在您的模型中定义两个 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
导入,而 main_app
在 INSTALLED_APPS
中注册,我很幸运他们都工作了。
但是因为我只将每个 app
添加到 INSTALLED_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...这花了我很长时间才弄清楚,我在任何地方都找不到解决方案...我什至去了 google 结果的第 2 页。
希望这对某人有所帮助!
- 确保您的应用在 settings.py
的 installed_apps 中被提及
- 确保你的模型 class 扩展了 models.Model
首先,请确保您的应用已在 setting.py 中的 Installed_app 中注册
那么上面的答案就完美无缺了
我忘了输入正确的参数:
class LineInOffice(models.Model): # here
addressOfOffice = models.CharField("Корхоная жош",max_length= 200) #and here
...
在models.py
然后它开始不再烦人
未在应用程序中检测到更改 'myApp '
另一个可能的原因是,如果您在另一个文件(而不是包中)中定义了一些模型并且没有在其他任何地方引用它。
对我来说,只需将 from .graph_model import *
添加到 admin.py
(其中 graph_model.py
是新文件)即可解决问题。
我的问题比上面的答案简单得多,而且只要您的项目已经设置好并开始工作,这可能是一个更常见的原因。在我的一个已经运行了很长时间的应用程序中,迁移似乎很不稳定,所以匆忙中,我做了以下事情:
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
更糟。
希望这可以帮助某人在几个小时内对 "No changes detected" 错误发誓。
在我的例子中,我忘记插入 class 参数
错误:
class AccountInformation():
正确
class AccountInformation(models.Model):
可能的原因可能是删除了现有的数据库文件和迁移文件夹
你可以使用 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
的新应用时遇到了不同的问题。我想在该应用程序中分离模型,所以我有 2 个模型文件,分别命名为 deals.py
和 dealers.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(你的模特在这里)
您可以执行以下操作:-
1. admin.site.register(YourModelHere) # 在 admin.py
2.重新加载页面并重试
3. 按 CTRL-S 并保存
4.可能有错误,专门检查models.py和admin.py
5. 或者,最后重启服务器
我在 django 3.0 中遇到了类似的问题,根据 official documentation 中的迁移部分,运行 这足以更新我的 table 结构:
python manage.py makemigrations
python manage.py migrate
但输出始终相同:'no change detected' 关于我执行 'makemigrations' 脚本后的模型。
我想在 db:
上更新的模型在 models.py 上有语法错误
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]
在这种情况下,该函数将覆盖上面的设置,使其 "invisible" 变为 makemigrations
。
您能做的最好的事情就是删除现有的数据库。在我的例子中,我使用的是 phpMyAdmin SQL 数据库,所以我手动删除了在那里创建的数据库。
删除后:
我在 PhpMyAdmin 中创建数据库,并且没有添加任何 tables.
再次运行以下命令:
python manage.py makemigrations
python manage.py migrate
在这些命令之后:你可以看到django已经自动在数据库中创建了其他必要的tables(大约有10个tables)。
python manage.py makemigrations <app_name>
python manage.py migrate
最后:在上面的命令之后,您创建的所有模型(table)都直接导入到数据库中。
希望这会有所帮助。
我遇到此错误的问题是我包含了:
class Meta:
abstract = True
我想为其创建迁移的内部模型。
另一种可能是您压缩了一些迁移并应用了生成的迁移,但忘记从中删除 replaces
属性。
这可以通过使用下面提到的两个步骤来完成。
- 将您的 app 添加到
settings.py
> INSTALLED_APPS
- 打开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。
方法:1
步骤:1
确保您的应用必须包含在 INSTALLED_APPS
中 settings.py
状态:2
python manage.py makemigrations <appname>
如果显示相同的消息(未检测到更改)
!警告这对您的项目来说非常危险,因此在应用方法 2 之前确保您的项目有备份。
方法二
重命名您的应用名称并使用以下方式制作新应用:
django-admin startapp <appname>
从旧应用程序
复制所有 .py
个文件 except
- 迁移文件夹
- pycache文件夹
- 初始化.py
- test.py 文件如果你没有在里面写代码
并粘贴到您最近制作的新应用中
请记住,您必须为新应用命名完全相同的名称,否则您必须在项目中进行更多更改。
我试图使用 makemigrations 命令在现有应用程序中创建迁移,但它输出 "No changes detected"。
通常我使用 startapp
命令创建新应用程序,但在创建它时并未将其用于此应用程序。
调试后,我发现它没有创建迁移,因为应用程序缺少migrations
package/folder。
如果文件夹不存在或者我遗漏了什么,如果它创建该文件夹会更好吗?
要为应用程序创建初始迁移,运行 makemigrations
并指定应用程序名称。将创建迁移文件夹。
./manage.py makemigrations <myapp>
您的应用必须首先包含在 INSTALLED_APPS
中(在 settings.py 中)。
有时 ./manage.py makemigrations
优于 ./manage.py makemigrations <myapp>
因为它可以处理应用程序之间的某些冲突。
这些情况悄无声息地发生,需要几个小时 swearing
才能理解可怕的 No changes detected
消息的真正含义。
因此,使用以下命令是更好的选择:
./manage.py makemigrations <myapp1> <myapp2> ... <myappN>
我读过许多关于这个问题的答案,通常以其他方式简单地说明 运行 makemigrations
。但对我来说,问题出在模型的 Meta
子 class 中。
我有一个显示 label = <app name>
的应用程序配置(在 apps.py
文件中,在 models.py
、views.py
等旁边)。如果你的 meta class 没有与应用程序标签相同的标签(例如,因为你将一个太大的应用程序拆分为多个),则不会检测到任何更改(也没有任何有用的错误消息) .所以在我的模型中 class 我现在有:
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
django 在 makemigrations
命令期间未检测到要迁移的内容有多种可能的原因。
- 迁移文件夹您的应用程序中需要一个迁移包。
- INSTALLED_APPS 您需要在
INSTALLED_APPS
.dict 中指定您的应用
- 冗长 以 运行
makemigrations -v 3
开始冗长。这可能会阐明问题。 - 完整路径 在
INSTALLED_APPS
中建议指定完整的模块app配置路径'apply.apps.MyAppConfig' - --settings 您可能需要确保设置了正确的设置文件:
manage.py makemigrations --settings mysite.settings
- 指定应用程序名称 明确将应用程序名称放入
manage.py makemigrations myapp
- 单独缩小应用程序的迁移范围并且帮助您隔离问题。 model meta 检查你的模型 meta
是否正确 调试 django 调试 django 核心脚本。 makemigrations 命令非常简单。 Here's how to do it in pycharm。相应地更改您的脚本定义(例如:
makemigrations --traceback myapp
)
app_label
多个数据库:
- Db Router 使用 django db router 时,路由器 class(您的自定义路由器 class)需要实现
allow_syncdb
方法。
makemigrations always creates migrations for model changes, but if allow_migrate() returns False,
我从 django 外部复制了一个 table 并且 Meta class 默认为“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
更改为 True
,makemigrations
开始进行更改。
我遇到了这里没有描述的另一个问题,这让我抓狂。
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' 的模型迁移,但也没有抛出错误。删除 ',' 后,它按预期工作。
所以复制和粘贴时要小心 :-)
解决方案是您必须将您的应用包含在 INSTALLED_APPS 中。
我错过了,我发现了同样的问题。
指定我的应用名称后迁移成功
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'boards',
]
请注意我在最后提到了 boards,这是我的应用名称。
我通过这样做解决了这个问题:
- 删除 "db.sqlite3" 文件。 这里的问题是你当前的数据库会被清空,所以你需要重新制作。
- 在您编辑的应用程序的迁移文件夹中,删除最后更新的文件。请记住,第一个创建的文件是:“0001_initial.py”。例如:我新建了一个class并通过"makemigrations"和"migrate"程序注册了它,现在创建了一个名为“0002_auto_etc.py”的新文件;删除它。
- 转到“pycache”文件夹(在迁移文件夹内)并删除文件“0002_auto_etc.pyc”。
- 最后,转到控制台并使用 "python manage.py makemigrations" 和 "python manage.py migrate"。
您应该在 setting.py
polls.apps.PollsConfig
添加到 INSTALLED_APPS
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 博客或您的应用名称
您可能遇到的一个非常愚蠢的问题是在您的模型中定义两个 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
导入,而 main_app
在 INSTALLED_APPS
中注册,我很幸运他们都工作了。
但是因为我只将每个 app
添加到 INSTALLED_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...这花了我很长时间才弄清楚,我在任何地方都找不到解决方案...我什至去了 google 结果的第 2 页。
希望这对某人有所帮助!
- 确保您的应用在 settings.py 的 installed_apps 中被提及
- 确保你的模型 class 扩展了 models.Model
首先,请确保您的应用已在 setting.py 中的 Installed_app 中注册 那么上面的答案就完美无缺了
我忘了输入正确的参数:
class LineInOffice(models.Model): # here
addressOfOffice = models.CharField("Корхоная жош",max_length= 200) #and here
...
在models.py 然后它开始不再烦人
未在应用程序中检测到更改 'myApp '
另一个可能的原因是,如果您在另一个文件(而不是包中)中定义了一些模型并且没有在其他任何地方引用它。
对我来说,只需将 from .graph_model import *
添加到 admin.py
(其中 graph_model.py
是新文件)即可解决问题。
我的问题比上面的答案简单得多,而且只要您的项目已经设置好并开始工作,这可能是一个更常见的原因。在我的一个已经运行了很长时间的应用程序中,迁移似乎很不稳定,所以匆忙中,我做了以下事情:
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
更糟。
希望这可以帮助某人在几个小时内对 "No changes detected" 错误发誓。
在我的例子中,我忘记插入 class 参数
错误:
class AccountInformation():
正确
class AccountInformation(models.Model):
可能的原因可能是删除了现有的数据库文件和迁移文件夹
你可以使用 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
的新应用时遇到了不同的问题。我想在该应用程序中分离模型,所以我有 2 个模型文件,分别命名为 deals.py
和 dealers.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(你的模特在这里)
您可以执行以下操作:- 1. admin.site.register(YourModelHere) # 在 admin.py 2.重新加载页面并重试 3. 按 CTRL-S 并保存 4.可能有错误,专门检查models.py和admin.py 5. 或者,最后重启服务器
我在 django 3.0 中遇到了类似的问题,根据 official documentation 中的迁移部分,运行 这足以更新我的 table 结构:
python manage.py makemigrations
python manage.py migrate
但输出始终相同:'no change detected' 关于我执行 'makemigrations' 脚本后的模型。 我想在 db:
上更新的模型在 models.py 上有语法错误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]
在这种情况下,该函数将覆盖上面的设置,使其 "invisible" 变为 makemigrations
。
您能做的最好的事情就是删除现有的数据库。在我的例子中,我使用的是 phpMyAdmin SQL 数据库,所以我手动删除了在那里创建的数据库。
删除后: 我在 PhpMyAdmin 中创建数据库,并且没有添加任何 tables.
再次运行以下命令:
python manage.py makemigrations
python manage.py migrate
在这些命令之后:你可以看到django已经自动在数据库中创建了其他必要的tables(大约有10个tables)。
python manage.py makemigrations <app_name>
python manage.py migrate
最后:在上面的命令之后,您创建的所有模型(table)都直接导入到数据库中。
希望这会有所帮助。
我遇到此错误的问题是我包含了:
class Meta:
abstract = True
我想为其创建迁移的内部模型。
另一种可能是您压缩了一些迁移并应用了生成的迁移,但忘记从中删除 replaces
属性。
这可以通过使用下面提到的两个步骤来完成。
- 将您的 app 添加到
settings.py
> INSTALLED_APPS - 打开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。
方法:1
步骤:1
确保您的应用必须包含在 INSTALLED_APPS
中 settings.py
状态:2
python manage.py makemigrations <appname>
如果显示相同的消息(未检测到更改)
!警告这对您的项目来说非常危险,因此在应用方法 2 之前确保您的项目有备份。
方法二
重命名您的应用名称并使用以下方式制作新应用:
django-admin startapp <appname>
从旧应用程序
复制所有.py
个文件 except
- 迁移文件夹
- pycache文件夹
- 初始化.py
- test.py 文件如果你没有在里面写代码
并粘贴到您最近制作的新应用中
请记住,您必须为新应用命名完全相同的名称,否则您必须在项目中进行更多更改。