我试图使用makemigrations命令在现有的应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp命令创建新的应用程序,但在创建这个应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为迁移包/文件夹从应用程序中丢失。
如果文件夹不存在或者我遗漏了什么,如果它创建文件夹会更好吗?
我试图使用makemigrations命令在现有的应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp命令创建新的应用程序,但在创建这个应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为迁移包/文件夹从应用程序中丢失。
如果文件夹不存在或者我遗漏了什么,如果它创建文件夹会更好吗?
当前回答
在创建一个名为deals的新应用程序时,我遇到了一个不同的问题。我想在应用程序中分离模型,所以我有两个模型文件,分别命名为deals.py和dealers.py。 当运行python manage.py makemigrations时,我得到:未检测到变化。
我继续,在__init__.py中,它位于与我的模型文件(deals和dealer)相同的目录中
from .deals import *
from .dealers import *
然后makemigrations命令起作用了。
事实证明,如果你没有在任何地方导入模型,或者你的模型文件名不是models.py,那么模型就不会被检测到。
发生在我身上的另一个问题是我在settings.py中编写应用程序的方式:
我有:
apps.deals
它应该包括根项目文件夹:
cars.apps.deals
其他回答
这是一个评论,但可能应该是一个答案。
确保你的应用程序名称在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
对于这个错误,我的问题在于我包含了:
class Meta:
abstract = True
里面的模型,我想创建迁移。
我的问题比上面的答案要简单得多,可能是一个更常见的原因,只要你的项目已经设置好并正在工作。在我的一个已经工作了很长时间的应用程序中,迁移似乎不稳定,所以我匆忙地做了以下工作:
rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected
Whaat ? ?
我还错误地删除了所有__init__.py文件:(-在我进入后,一切都重新工作了:
touch ads1/migrations/__init__.py
对于我的每一份申请,makemigrationations都再次起作用。
原来我通过复制另一个应用程序手动创建了一个新的应用程序,并且忘记将__init__.py放在migrations文件夹中,这限制了我,使一切都不稳定-导致我使用上面描述的rm -r使情况更糟。
希望这能帮助一些人在“未检测到更改”的错误中咒骂几个小时。
我读过很多关于这个问题的答案,通常都是简单地用其他方式进行移民。但对我来说,问题在于模型的Meta子类。
我有一个应用程序配置,说label = <应用程序名称>(在apps.py文件,旁边的models.py, views.py等)。如果你的元类没有与应用标签相同的标签(例如,因为你把一个太大的应用拆分成多个),就不会检测到任何变化(也不会有任何有用的错误消息)。所以在我的模型类中,我现在有:
class ModelClassName(models.Model):
class Meta:
app_label = '<app name>' # <-- this label was wrong before.
field_name = models.FloatField()
...
运行Django 1.10。
当向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
│ └── ...