暑假期间可能有点迷上了Django了,最近在一次操作中误以为migrations文件夹中的python文件都是一次性的遂全部在Pycharm中删除了,不带回收站的那种……随后发现悲剧了,makemigrations无论怎么修改models.py都无法发现改动,提示“No Changes Detected”,然后得知makemigrations是基于migrations中的文件做对比和更新数据库了。

所以请不要改动migrations中的文件,如果嫌弃此文件夹由于频繁改动models而过于庞大,请备份后按新的models进行makemigrations后migrate。
具体步骤:

  • 删库,SQLite直接删除文件,其他数据库删除对应数据库。
  • 删除migrations中所有文件,只保留__init__.py。
  • 执行命令更新数据库。(此步骤可能出错)
python manage.py makemigrations
python manage.py migrate

如果还需要保留数据库数据的情况下整合migrations,请参见
https://www.jianshu.com/p/7aa23f044cef

不过还好是在测试环境,数据不要也罢,在执行到上述第三步时报错ValueError: Related model 'app.model' cannot be resolved,乍一看是外键无法被解析的错误,好一顿折腾检查是否规范地使用了外键(这里其实是在做无用功,毕竟数据库完好时没这问题),结果发现是在没有init文件时,Django似乎无法正常分辨表之间的依赖关系,进而在migration时可能先生成了携带外键的表,然后发现外键指向的表不存在从而抛出错误。

一个智障的解决办法是:

  1. 先将models.py中所有OneToOneField,ManyToManyField等外键字段注释掉,makemigrations后migrate。
  2. 将注释撤销,此时由于外键指向的表已经事先生成了,所以不会再报错。
Last modification:August 12th, 2019 at 08:25 pm
If you think my article is useful to you, please feel free to appreciate