Django创建/更新数据库条目时出现Duplicate Entry完整性报错如何解决
问题根因
你代码中的更新逻辑存在语法错误:Riasec_result.objects.update() 是作用于整张表的批量更新方法,执行时会将表内所有条目的user字段统一修改为你查询到的当前用户实例。而你的Riasec_result模型中user是OneToOneField类型,自带唯一约束(每个用户只能对应一条结果记录),批量更新操作会直接触发唯一键冲突,抛出Duplicate Entry报错。
另外你原有代码还有两处冗余问题:
objects.create()执行后已经自动完成数据写入,不需要额外调用save()方法- 注释掉的if判断逻辑如果放开,查询不到数据时会直接抛出
DoesNotExist异常,无法走到else分支
修复方案
方案1:修改原有try-except逻辑
仅需调整try块内的更新写法,限定仅更新当前用户对应的单条记录即可:
try: user_result = Riasec_result.objects.get(user=request.user) # 写法1:修改实例属性后保存 user_result.reality = r user_result.investigative = i user_result.artistic = a user_result.social = s user_result.enterprising = e user_result.conventional = c user_result.save() # 写法2:通过filter限定单条后批量更新,无需额外调用save,二选一即可 # Riasec_result.objects.filter(user=request.user).update( # reality=r, # investigative=i, # artistic=a, # social=s, # enterprising=e, # conventional=c # ) except ObjectDoesNotExist: # 去掉冗余的save调用 Riasec_result.objects.create( user=request.user, reality=r, investigative=i, artistic=a, social=s, enterprising=e, conventional=c )
方案2:用update_or_create简化逻辑(推荐)
完全替换原有try-except块,Django原生方法已经封装了存在则更新、不存在则创建的逻辑,只要参数书写正确不会触发重复报错:
Riasec_result.objects.update_or_create( # 唯一查询条件,不要放到defaults中 user=request.user, # 需要更新/写入的字段统一放到defaults参数 defaults={ 'reality': r, 'investigative': i, 'artistic': a, 'social': s, 'enterprising': e, 'conventional': c } )
之前你调用update_or_create报错,大概率是把user字段放到了defaults参数里,或者查询条件没有使用唯一约束字段,按照上面的写法调整即可。
内容的提问来源于stack exchange,提问作者jpf911
相关产品推荐
相关产品推荐

