Django中需将外键数据类型从bigint改为string的问题求助
问题解决:外键数据类型不匹配(bigint vs CharField)
问题分析
你的模型定义里,Purchase的department外键已明确关联Department的name字段(CharField类型主键),但数据库中inventory_purchase表的department_name字段却是bigint类型,类型不匹配导致保存时报错。核心原因是数据库表结构未与更新后的模型同步——大概率是修改模型后未正确生成/执行迁移,或是之前的迁移基于Department使用自增主键的旧版本创建。
解决方案
1. 先备份数据库
操作前务必备份数据,避免意外丢失。
2. 无重要数据时的快速修复
如果inventory_purchase表中没有需要保留的数据:
- 删除
migrations目录下与Purchase模型相关的旧迁移文件 - 生成新迁移:
python manage.py makemigrations
- 检查生成的迁移文件,确认包含将
department_name字段类型从bigint修改为varchar(50)的操作 - 执行迁移:
python manage.py migrate
3. 需保留数据时的修复
如果表中已有数据,需手动编写迁移文件来转换字段类型:
在migrations目录下创建新迁移文件(如000x_fix_department_fk_type.py),内容示例:
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('inventory', '000x_your_previous_migration'), # 替换为你实际的前序迁移文件名 ] operations = [ migrations.AlterField( model_name='purchase', name='department', field=models.ForeignKey(db_column='department_name', on_delete=models.PROTECT, to_field='name', to='inventory.department'), ), ]
执行迁移:
python manage.py migrate
4. 验证修复结果
执行迁移后,重新查看数据库表结构:
invendb=# \d inventory_purchase
确认department_name字段类型变为character varying(50),之后再尝试保存模型实例即可。
内容的提问来源于stack exchange,提问作者Trex
相关产品推荐
相关产品推荐

