makemigrations不会检测模型中的更改

Esc*_*her 11 migration django

我正在使用django 1.9.6.我最近删除了我的迁移和跑migrate --run-syncdbmakemigrations my_app.今天我在我的一个模型中添加了一个新字段:

models.py:

value = models.PositiveSmallIntegerField(null=True)
Run Code Online (Sandbox Code Playgroud)

我尝试迁移更改,但未makemigrations检测到更改.它只是开发版本,因此我可以重新同步(我不必保留数据),但--run-syncdb再次运行也不会检测到它.

为什么不迁移?

小智 19

删除除__init__之外的所有过去的迁移文件和__pycache__文件:

python manage.py makemigrations yourApp 
Run Code Online (Sandbox Code Playgroud)

之后,确保db与model.py中的代码相同(删除新更改)并运行下一行:

python manage.py migrate --fake-initial
Run Code Online (Sandbox Code Playgroud)

现在在model.py中添加所有更改并运行下一行:

python manage.py makemigrations 
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

最诚挚的问候,克里斯蒂安


dot*_*mly 11

你不应该删除迁移,你应该压缩它们.如果您只是删除了可能搞砸了的文件,最简单的恢复方法是重新同步代码以恢复文件.一个更复杂的路线是从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
Run Code Online (Sandbox Code Playgroud)

我将所有初始数据存储在fixtures文件中,该命令会清除整个数据库,--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.务必在部署时删除它,这样就不会发生意外!

  • 如果您将“set -e”放在“builddb.sh”脚本的顶部,您将能够将所有行一个接一个地放置,而无需使用 &&。`set` 会导致整个脚本在出现第一个错误时停止。 (2认同)

小智 10

我遇到过同样的问题.我意识到我在模型上定义了一个属性,其名称与我试图在模型上添加的字段相同.确保模型没有与您尝试添加的字段同名的模型属性/方法.

  • 同样在这里......这个答案节省了我几个小时。干得好,Liyosi!:) (2认同)

小智 7

如果没有文件migrations夹,请尝试__init__.py在应用程序文件夹中创建一个包含空文件的文件migrations夹。并进行迁移。

  • 这是我最后的问题 (3认同)