我试图使用makemigrations命令在现有的应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp命令创建新的应用程序,但在创建这个应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为迁移包/文件夹从应用程序中丢失。
如果文件夹不存在或者我遗漏了什么,如果它创建文件夹会更好吗?
我试图使用makemigrations命令在现有的应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp命令创建新的应用程序,但在创建这个应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为迁移包/文件夹从应用程序中丢失。
如果文件夹不存在或者我遗漏了什么,如果它创建文件夹会更好吗?
当前回答
我知道这是一个老问题,但我一整天都在和这个问题斗争,我的解决方法很简单。
我的目录结构是这样的……
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注册的,我只是很幸运,他们都工作。
但是,由于我只将每个应用程序添加到INSTALLED_APPS,而不是app_sub*,当我最终添加一个新的模型文件时,没有导入到其他任何地方,Django完全忽略了它。
我的修复是添加一个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
然后从apps。app中添加。App_sub1 import *,以此类推到每个应用级models.py文件。
在那里……我花了很长时间才弄明白,我在任何地方都找不到解决方案……我甚至翻到了谷歌结果的第二页。
希望这能帮助到一些人!
其他回答
我在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, ...)
解决了这个愚蠢的错误,有了这些命令,迁移就没有问题了。也许这能帮到别人。
首先,确保你的应用已经在setting.py中的Installed_app中注册了 那么上面的答案就完全正确了
这是一个评论,但可能应该是一个答案。
确保你的应用程序名称在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
当向django api应用程序添加新模型并运行python manage.py makemigrations时,工具没有检测到任何新模型。
奇怪的是,旧模型确实被makemigrations选中了,但这是因为它们在urlpatterns链中被引用,而工具以某种方式检测到了它们。所以要注意这种行为。
这个问题是因为与models包对应的目录结构有子包,并且所有__init__.py文件都是空的。它们必须显式地在每个子文件夹和__init__.py模型中导入所有必需的类,以便Django使用makemigrationations工具来获取它们。
models
├── __init__.py <--- empty
├── patient
│ ├── __init__.py <--- empty
│ ├── breed.py
│ └── ...
├── timeline
│ ├── __init__.py <-- empty
│ ├── event.py
│ └── ...
这可能会帮助其他人,因为我最终花了几个小时试图追踪它。
如果您的模型中有同名的函数,这将删除该值。事后看来很明显,但尽管如此。
所以,如果你有这样的东西:
class Foobar(models.Model):
[...]
something = models.BooleanField(default=False)
[...]
def something(self):
return [some logic]
在这种情况下,该函数将覆盖上面的设置,使其“隐形”进行移民。