You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ModelForm无法更新实例,触发IntegrityError错误

问题根源:重写模型save方法时错误使用了commit参数

你的问题出在Upload模型重写的save方法上,错误引入了ModelForm特有的commit参数,导致调用父类save时强制触发插入操作,而非更新现有实例。

错误原因分析

Django的Model.save()方法本身没有commit参数,这个参数是ModelForm.save()的专属参数。你在模型的save方法中定义了commit=True参数,调用super().save(commit)时,实际上是把commit的值传递给了父类save方法的第一个参数force_insert:

  • 当commit=True时,等同于force_insert=True,这会强制Django尝试插入新记录,而非更新现有实例,因此触发主键重复的IntegrityError。
  • 同时,你的save方法没有返回父类save的结果,也可能导致ModelForm无法正确获取更新后的实例。

修复方案

修改Upload模型的save方法,移除错误的commit参数,并正确调用父类save方法:

class Upload(models.Model):
    # ... 其他字段定义 ...

    def save(self, *args, **kwargs):
        self.filename = self.file.name
        # 调用父类save方法并返回结果,兼容所有父类参数
        return super().save(*args, **kwargs)

验证逻辑

修改后:

  1. ModelForm处理更新请求时,会正确传递实例给模型的save方法,不会触发force_insert。
  2. 父类save方法会根据实例是否已有主键(即是否为现有记录)自动选择更新或插入操作。
  3. 返回父类save的结果,确保ModelForm能正确处理后续逻辑。

内容的提问来源于stack exchange,提问作者kontur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:05