PostgreSQL环境下Django添加字段后migrate报错:列不存在
解决Django添加字段后migrate报错的问题
核心问题分析
回滚迁移后数据库中无track_code字段,但模型类仍保留该字段,导致Django运行时尝试查询不存在的列;同时可能存在迁移记录与实际文件不同步的情况。
分步解决办法
1. 临时注释模型中的新字段
打开Ticket模型所在文件,注释掉新增的字段代码:
# track_code = models.CharField(max_length=32, verbose_name=_('کد رهگیری'), default=generate_rrr_unique_trackcode)
2. 同步迁移状态
执行命令确保数据库与旧迁移版本完全对齐:
python3 manage.py migrate app_name 0001 python3 manage.py makemigrations --dry-run app_name
若--dry-run未提示生成新迁移,说明当前模型与0001迁移状态一致。
3. 清理迁移表残留记录
通过PostgreSQL命令行连接数据库,检查并清理多余迁移记录:
-- 查看app_name的迁移记录 SELECT * FROM django_migrations WHERE app = 'app_name'; -- 删除0001之后的记录(如果存在) DELETE FROM django_migrations WHERE app = 'app_name' AND name > '0001_initial';
4. 重新生成并执行迁移
取消模型中track_code字段的注释,生成新迁移文件:
python3 manage.py makemigrations app_name
打开生成的迁移文件,确认字段添加逻辑无误后执行迁移:
python3 manage.py migrate app_name
额外注意事项
- 确保
generate_rrr_unique_trackcode函数不依赖track_code字段本身,需用独立逻辑生成唯一值(如UUID、随机字符串),避免迁移时因字段未创建报错。 - 若仍有问题,可尝试先执行
python3 manage.py migrate --fake app_name 0001,再重新生成迁移。
内容的提问来源于stack exchange,提问作者Mahdi Kh
相关产品推荐
相关产品推荐

