django makemigrations不检测模型中的更改

chy5wohz  于 2023-06-25  发布在  Go
关注(0)|答案(8)|浏览(143)

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

  • models.py:*
value = models.PositiveSmallIntegerField(null=True)

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

js81xvg6

js81xvg61#

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

python manage.py makemigrations yourApp

之后,确保数据库与www.example.com中的代码相同(删除新的更改)并运行下一行:model.py (remove new changes) and run next line:

python manage.py migrate --fake-initial

现在,在www.example.com中添加所有更改,并运行以下行:model.py and run next lines:

python manage.py makemigrations 
python manage.py migrate

最好的问候,克里斯蒂安

8fq7wneg

8fq7wneg2#

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

abithluo

abithluo3#

您不应该删除迁移,而应该压缩它们。如果您只是删除了可能会搞砸的文件,最简单的恢复方法是重新同步代码以恢复文件。一个更复杂的方法是从django_migrations表中删除所有记录,然后从头开始重新初始化迁移,但是步骤/问题比我真正能做的要多,我不推荐这样做。
makemigrations没有检测到更改的原因可能是因为该应用程序中没有migrations文件夹。如果您运行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重建了模式,并在跳过实际迁移文件的同时加载了初始数据。
因此,如果您不关心任何数据,或者可以轻松地将其移动到一个fixture,那么您可以删除并重新创建DB。然后,您可以自由删除所有迁移文件夹,并且可以使用上面的命令,直到您上线并需要移动到使用迁移。

更新Django 1.11***仍在使用3.2.5

我开始使用Django 1.11,并注意到如果你对框架模型有依赖关系,并且实际上没有迁移,测试框架可能会失败。这是新的命令,我使用擦除一切,并重新开始,而仍在发展。

set -e
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了。请务必在部署时删除它,以免发生意外!

5cnsuln7

5cnsuln74#

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

q9yhzks0

q9yhzks05#

在我的例子中,我创建了一个新项目并创建了一个应用程序。python manage.py makemigrations返回no change detected,尽管我添加了一些模型。发现您需要在settings.py文件中的INSTALLED_APPS列表中手动添加应用程序的名称。除非您这样做,否则无法检测到该应用程序迁移中的任何更改。

fdbelqdn

fdbelqdn6#

如果您正在删除一个模型,并希望在迁移中获取更改,请确保该模型没有仍然存在的*.pyc

yvt65v4c

yvt65v4c7#

另一个例子是抽象类。确保模型的元类没有abstract = True属性。

exdqitrt

exdqitrt8#

在我的例子中,settings.py文件缺少我创建新模型的应用程序。在settings.py文件的INSTALLED_APPS列表中声明应用后,python manage.py makemigrations命令可以正常工作。

相关问题