我正在使用django 1.9.6。我最近删除了迁移并运行了migrate --run-syncdb
和makemigrations my_app
。今天我在我的一个模型中添加了一个新字段:
models.py:
value = models.PositiveSmallIntegerField(null=True)
我尝试迁移更改,但makemigrations
没有检测到更改。它只是开发版本,因此我可以重新同步(我不必保留数据),但再次运行--run-syncdb
也无法检测到它。
为什么不进行迁移?
答案 0 :(得分:18)
删除除__init__之外的所有过去的迁移文件和__pycache__文件 然后:
python manage.py makemigrations yourApp
之后确保db与model.py中的代码相同(删除新更改)并运行下一行:
python manage.py migrate --fake-initial
现在在model.py中添加所有更改并运行下一行:
python manage.py makemigrations
python manage.py migrate
最诚挚的问候, 克里斯蒂安
答案 1 :(得分:10)
我有同样的问题。我意识到我在模型上定义了一个属性,其名称与我试图在模型上添加的字段相同。确保模型没有与您尝试添加的字段同名的模型属性/方法。
答案 2 :(得分:9)
您不应删除迁移,您应该squash them。如果您只是删除了可能搞砸了的文件,最简单的恢复方法是重新同步代码以恢复文件。一个更复杂的路线是删除django_migrations
表中的所有记录并从头开始重新启动迁移,但是有更多的步骤/问题比我真正可以进入并且我不推荐它。
makemigrations未检测到更改的原因可能是因为该应用程序中没有迁移文件夹。如果您运行python manage.py makemigrations your_app --initial
,它可能会检测并生成迁移,或者由于您的文件和django_migrations
表格不同而可能会发生迁移。
--run-syncdb
命令很好,如果您不关心数据,通常在实际部署之前,但是一旦开始使用迁移,就不应再使用--run-syncdb
命令了。例如,在初始开发期间,这里是我运行每个模型更改而不是处理迁移的代码:
dropdb mydb && createdb mydb && python manage.py migrate --run-syncdb && python manage.py loaddata initial
我将所有初始数据存储在fixtures file中,该命令会清除整个数据库,--run-syncdb
重建架构,并在跳过实际迁移文件时加载初始数据。
因此,如果您不关心任何数据,或者可以轻松地将其移动到固定装置,那么您可以删除并重新创建数据库。然后,您可以自由删除所有迁移文件夹,并且可以使用上面的命令,直到您上线并需要转移到使用迁移。
DJANGO 1.11更新
我开始使用Django 1.11,并注意到如果您对框架模型有依赖性并且实际上没有迁移,那么测试框架可能会失败。这是我用来擦除所有内容并在开发过程中重新开始的新命令。
dropdb yourdb && createdb yourdb && find . -name "migrations" -type d -prune -exec rm -rf {} \; && python manage.py makemigrations name every app you use seperated by space && python manage.py migrate && python manage.py loaddata initial
我把它放在项目根目录builddb.sh
中(在manage.py旁边),这样我就可以运行./builddb.sh
了。务必在部署时将其删除,以免发生意外!
答案 3 :(得分:0)
如果您要删除模型,并希望在迁移中获取更改,请确保该模型中没有*.pyc
。
答案 4 :(得分:0)
如果还没有migrations
文件夹,请尝试创建一个__init__.py
文件夹,该文件夹在您的应用文件夹中包含一个空的migrations
文件。并进行迁移。
答案 5 :(得分:0)
另一种情况是抽象类。确保模型的元类没有 abstract = True
属性。