我用的是Django 1.9.6。我最近删除了我的迁移并运行了migrate --run-syncdb
和makemigrations my_app
。今天,我在我的一个模型中添加了一个新字段:
- models.py:*
value = models.PositiveSmallIntegerField(null=True)
我尝试迁移更改,但makemigrations
没有检测到更改。这只是开发版本,所以我可以重新同步(我不必保留数据),但再次运行--run-syncdb
也检测不到它。
为什么它不迁移?
8条答案
按热度按时间js81xvg61#
删除除__init__之外的所有过去的迁移文件和__pycache__文件,然后:
之后,确保数据库与www.example.com中的代码相同(删除新的更改)并运行下一行:model.py (remove new changes) and run next line:
现在,在www.example.com中添加所有更改,并运行以下行:model.py and run next lines:
最好的问候,克里斯蒂安
8fq7wneg2#
我也有同样的问题。我意识到我在模型上定义了一个属性,它与我试图添加到模型上的字段同名。确保模型没有与您尝试添加的字段同名的模型属性/方法。
abithluo3#
您不应该删除迁移,而应该压缩它们。如果您只是删除了可能会搞砸的文件,最简单的恢复方法是重新同步代码以恢复文件。一个更复杂的方法是从
django_migrations
表中删除所有记录,然后从头开始重新初始化迁移,但是步骤/问题比我真正能做的要多,我不推荐这样做。makemigrations没有检测到更改的原因可能是因为该应用程序中没有migrations文件夹。如果您运行
python manage.py makemigrations your_app --initial
,它可能会检测并生成迁移,或者由于您的文件和django_migrations
表中的差异而异常。当您不关心数据时,
--run-syncdb
命令非常有用,通常是在实际部署之前,但一旦开始使用迁移,就不应该再使用--run-syncdb
命令。例如,在最初的开发过程中,这里是我在每次模型更改时运行的代码,而不是处理迁移:我将所有初始数据存储在fixtures file中,该命令清除了整个数据库,
--run-syncdb
重建了模式,并在跳过实际迁移文件的同时加载了初始数据。因此,如果您不关心任何数据,或者可以轻松地将其移动到一个fixture,那么您可以删除并重新创建DB。然后,您可以自由删除所有迁移文件夹,并且可以使用上面的命令,直到您上线并需要移动到使用迁移。
更新Django 1.11***仍在使用3.2.5
我开始使用Django 1.11,并注意到如果你对框架模型有依赖关系,并且实际上没有迁移,测试框架可能会失败。这是新的命令,我使用擦除一切,并重新开始,而仍在发展。
我把它放在项目根目录下的
builddb.sh
中(紧挨着manage.py),这样我就可以运行./builddb.sh
了。请务必在部署时删除它,以免发生意外!5cnsuln74#
如果您的应用程序文件夹中没有
migrations
文件夹,请尝试创建一个migrations
文件夹,其中包含一个空的__init__.py
文件。进行迁徙。q9yhzks05#
在我的例子中,我创建了一个新项目并创建了一个应用程序。
python manage.py makemigrations
返回no change detected
,尽管我添加了一些模型。发现您需要在settings.py
文件中的INSTALLED_APPS
列表中手动添加应用程序的名称。除非您这样做,否则无法检测到该应用程序迁移中的任何更改。fdbelqdn6#
如果您正在删除一个模型,并希望在迁移中获取更改,请确保该模型没有仍然存在的
*.pyc
。yvt65v4c7#
另一个例子是抽象类。确保模型的元类没有
abstract = True
属性。exdqitrt8#
在我的例子中,settings.py文件缺少我创建新模型的应用程序。在settings.py文件的INSTALLED_APPS列表中声明应用后,
python manage.py makemigrations
命令可以正常工作。