makemigrations没有检测到模型中

时间:2016-05-22 04:47:22

标签: django migration

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

models.py:

value = models.PositiveSmallIntegerField(null=True)

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

为什么不进行迁移?

6 个答案:

答案 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属性。