我试图使用makemigrations命令在现有应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp
命令创建新的应用程序,但在创建此应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为一个应用程序中缺少migrations
包/文件夹。
如果没有这个文件夹,是否最好创建它,或者我漏掉了什么?
我试图使用makemigrations命令在现有应用程序中创建迁移,但它输出“未检测到更改”。
通常我使用startapp
命令创建新的应用程序,但在创建此应用程序时没有使用它。
调试后,我发现它没有创建迁移,因为一个应用程序中缺少migrations
包/文件夹。
如果没有这个文件夹,是否最好创建它,或者我漏掉了什么?
makemigrations
并指定应用程序名称。将创建迁移文件夹。./manage.py makemigrations <myapp>
你的应用程序必须首先被包含在INSTALLED_APPS
中(在settings.py文件中)。
migrations
文件夹,你需要指定应用程序的名称。这可能是因为你手动创建了该应用程序,或者从早期没有迁移的 Django 版本进行了升级。请注意,这里不涉及解释和其他内容。 - Alasdair__init__.py
)。 - Jibinmigrate
时可能会导致错误。 - Alasdairmakemigrations --traceback myapp
)。
allow_syncdb
方法。makemigrations总是为模型更改创建迁移,但如果allow_migrate()返回False,则不会执行migrate操作。
makemigrations
脚本查找从urls.py
连接的模型”。在此处找到:https://dev59.com/yKDia4cB1Zd3GeqPDnDm - Kyle我已经阅读了许多回答这个问题的答案,通常是建议以某些其他方式运行makemigrations
。但对我来说,问题在模型的Meta
子类中。
我有一个应用程序配置,其中说标签= <应用程序名称>
(在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。
另一个导致此问题的原因是字段后面有逗号,这会导致在进行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
,因为Python认为它是一个元组(tuple),而Django不认为它是一个字段。
is_dumb
等于 (models.BooleanField(default=False), )
,而 makemigrations
不知道如何将其转换为数据库列。 - hlongmoremigrations
文件夹中存在一个__init__.py
文件:
./manage.py makemigrations <myapp1> <myapp2> ... <myappN>
有时./manage.py makemigrations
比./manage.py makemigrations <myapp>
更优越,因为它可以处理应用程序之间的某些冲突。
这些情况会默默地发生,需要数小时的咒骂才能了解可怕的“未检测到更改”消息的真正含义。
因此,最好使用以下命令:
./manage.py makemigrations <myapp1> <myapp2> ... <myappN>
这是一条评论,但可能应该是一个答案。
请确保你的应用程序名称在 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
方法:1
步骤:1
确保您的应用程序在settings.py中的INSTALLED_APPS
中被包含。
步骤:2
python manage.py makemigrations <appname>
如果出现相同的消息(未检测到更改)
!警告:这对您的项目非常危险,因此在应用方法2之前,请确保备份您的项目。
方法2
重命名您的应用程序名称并使用以下命令创建新应用程序:
django-admin startapp <appname>
复制所有的.py
文件,除了旧应用程序中的:
并将它们粘贴到你最近创建的新应用程序中。
记住,你必须确保新应用程序的名称完全相同,否则你将不得不在项目中进行更多的更改。
我曾经从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
改为True
后,makemigrations
开始捕获更改。
我的问题比上面的答案简单得多,而且可能是一个更常见的原因,只要您的项目已经设置好并且正常运行。在我的一个应用程序中,迁移似乎有点不稳定,所以匆忙之间,我做了以下操作:
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
命令。
希望这能帮助某个人避免在 "未检测到任何更改" 错误前 swear 几个小时。
makemigrations <myapp>
,正如Alasdair所指出的那样。 - Dilrajapp/admin.py
中注册模型。 - Santi Rodriguez