Django模型迁移后字段类型不匹配与字段不存在问题求助
Django模型迁移后字段类型不匹配与字段不存在问题求助
咱们先拆解下你遇到的两个核心问题:
- 字段类型不匹配错误:你定义的
player_catch是IntegerField,但数据库里这个字段的默认值或者已有数据是datetime类型,导致Django保存数据时拿到了datetime值,却期望是数字,所以抛出了TypeError。这完全是因为你迁移时误把datetime当成默认值输入导致的。 - player_run字段不存在:这个错误说明
player_run字段根本没在数据库里创建成功,大概率是那次错误的迁移没正确执行,或者迁移文件的定义有问题。
下面给你两种解决思路,根据你的环境选择:
方法一:回滚迁移重新操作(推荐开发环境使用)
这种方法最干净,能彻底解决问题:
- 第一步,查看当前的迁移记录,找到你添加那三个字段的那次迁移:
找到对应app(比如你这里是python manage.py showmigrationsdashboard)下最新的那个迁移文件,比如名字是0003_add_player_stats.py这类。 - 第二步,回滚到这个迁移之前的版本:
这里的python manage.py migrate dashboard 0002_previous_migration0002_previous_migration是添加字段之前的迁移编号,比如如果添加字段的是0003,就填0002。 - 第三步,删掉那个有问题的迁移文件(就是刚才找到的添加三个字段的那个),然后重新生成迁移:
这时候会再次提示你输入默认值,这次一定要输入整数,比如python manage.py makemigrations0,和你模型里写的default=0保持一致。 - 第四步,执行迁移:
python manage.py migrate
方法二:直接修改数据库(适合生产环境,谨慎操作)
如果是生产环境不能随便回滚迁移,那可以直接操作数据库来修正:
- 登录到你的数据库(比如MySQL用
mysql命令,PostgreSQL用psql),找到dashboard_player表。 - 执行SQL语句修改字段类型和默认值:
- 如果你用的是MySQL:
ALTER TABLE dashboard_player MODIFY COLUMN player_run INT DEFAULT 0; ALTER TABLE dashboard_player MODIFY COLUMN player_wickets INT DEFAULT 0; ALTER TABLE dashboard_player MODIFY COLUMN player_catch INT DEFAULT 0; - 如果你用的是PostgreSQL:
-- 先转换字段类型,再设置默认值 ALTER TABLE dashboard_player ALTER COLUMN player_run TYPE INT USING player_run::INT; ALTER TABLE dashboard_player ALTER COLUMN player_run SET DEFAULT 0; ALTER TABLE dashboard_player ALTER COLUMN player_wickets TYPE INT USING player_wickets::INT; ALTER TABLE dashboard_player ALTER COLUMN player_wickets SET DEFAULT 0; ALTER TABLE dashboard_player ALTER COLUMN player_catch TYPE INT USING player_catch::INT; ALTER TABLE dashboard_player ALTER COLUMN player_catch SET DEFAULT 0;
- 如果你用的是MySQL:
另外,你可以检查下Django的迁移文件,确保里面的三个字段定义和你的模型一致,都是IntegerField且默认值为0,避免后续再出问题。
备注:内容来源于stack exchange,提问作者Aalok karn
相关产品推荐
相关产品推荐

