更新记录时出现 Django IntegrityError

Posted

技术标签:

【中文标题】更新记录时出现 Django IntegrityError【英文标题】:Django IntegrityError while updating a record 【发布时间】:2018-06-17 13:19:01 【问题描述】:

我有一个双列作为主键的模型。我对其进行过滤并获取我想要的记录,更改字段并保存它。据我所知,保存将更新记录并且不会在数据库中创建模型的新实例。所以应该没问题,但是当我尝试保存记录时,我遇到了完整性错误Duplicate entry '10-2' for key 'PRIMARY'

这里是sn-p的代码:

analysis = AnalysisResult.objects.filter(request=req.request_id)
for anal in analysis:
    anal.analysisresult_path = some_string
    anal.save() #this line is where the error occurs

这是我的模型:

class AnalysisResult(models.Model):

    analysisresult_path = models.CharField(db_column='analysisResult_path', max_length=255, blank=True,
                                       null=True)  # Field name made lowercase.
    detectionresult_path = models.CharField(db_column='detectionResult_path', max_length=255, blank=True,
                                        null=True)  # Field name made lowercase.
    targetcode = models.ForeignKey('TagetCode', models.DO_NOTHING,
                               db_column='targetCode_id')  # Field name made lowercase.
    request = models.ForeignKey('Request', models.DO_NOTHING, primary_key=True)


    class Meta:
        managed = False
        db_table = 'analysis_result'
        unique_together = (('request', 'targetcode'),)

【问题讨论】:

AnalysisResult.objects.filter(request=req.request_id) 按主键过滤等于某个值,您应该只获得一条记录是吗?你为什么要循环? @BearBrown unique_together = (('request', 'targetcode'),) request_id + targetcode_id 使记录一起唯一。 【参考方案1】:

啊,是的,欢迎来到django's strongest opinions 之一:所有表/模型都应该有一个可用于更新的主键字段。如果你没有这个,你必须为更新编写原始 SQL,因为save 将假定在where 子句中使用一个名为 id 的隐式主键字段。

【讨论】:

以上是关于更新记录时出现 Django IntegrityError的主要内容,如果未能解决你的问题,请参考以下文章

api rest 调用更新 django 模型时出现错误 415

CloudKit-更新记录:使用“saveRecord”更新记录时出现“客户端 oplock 错误”

更新现有记录时出现 Entity Framework Core 错误

Rails:创建/更新记录时出现 EOF 错误

使用 oledbcommand.executeNonQuery() 更新 MS Access 记录时出现问题,结果未更新

尝试使用 POJO 记录更新表时出现 Java jOOQ 问题