Django PostgreSQL模型迁移报integer类型输入语法错误如何解决
错误原因
- 模型层面存在属性调用错误:
Person模型仅定义了name字段,但其__str__方法返回不存在的fullname属性,Enrollment的__str__方法也调用了这个不存在的属性,会引发运行时错误。 - 终端抛出的
django.db.utils.DataError: invalid input syntax for type integer: "Build"错误,本质是PostgreSQL尝试向整数类型字段(此处为外键关联的主键ID字段)插入字符串值"Build",常见触发场景有两个:- 已生成的迁移文件中,外键字段(
person/job)被设置了字符串类型的错误默认值 - 数据库中已存在旧表数据,原关联字段为字符类型,调整为外键关联整数ID后旧数据不兼容
- 已生成的迁移文件中,外键字段(
修复步骤
1. 修正模型代码
将不存在的属性调用替换为已定义的字段,修正后代码如下:
class Person(models.Model): name = models.CharField(max_length=50, null=True) def __str__(self): return self.name if self.name else "" class Features(models.Model): name = models.CharField(max_length=30, null=True) feature = models.ManyToManyField(Person, through='Enrollment') def __str__(self): return self.name if self.name else "" class Enrollment(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE, null=True) job = models.ForeignKey(Features, on_delete=models.CASCADE, null=True) def __str__(self): return self.person.name if self.person and self.person.name else ""
2. 清理错误迁移和数据
根据你的数据保存需求选择对应方案:
- 开发环境无重要数据:删除对应app下
migrations目录中除__init__.py外的所有文件,连接PostgreSQL删除该app对应的所有表,重新执行python manage.py makemigrations和python manage.py migrate即可。 - 有存量数据不可删除:找到最新生成的迁移文件,检查外键字段的默认值配置,删除字符串类型的错误默认值,或替换为合法的整数ID;清理数据库旧表中不符合外键整数类型的异常数据后,再重新执行迁移。
3. 验证配置
迁移完成后可执行python manage.py shell创建测试实例,确认模型调用和数据写入无异常。
内容的提问来源于stack exchange,提问作者Zura Begadze
相关产品推荐
相关产品推荐

