如何解决Django中request_id字段的重复条目IntegrityError错误?
解决Django IntegrityError: request_id重复键冲突问题
错误根源
django.db.utils.IntegrityError: (1062, "Duplicate entry 'xxx' for key 'request_id'") 说明你的Gitinformation模型中request_id字段设置了unique=True约束,但创建新对象时生成了重复的request_id值,或是重复提交导致重复写入相同值。
修复步骤
1. 确保request_id自动生成唯一值
检查并修改models.py中Gitinformation模型的request_id字段定义,使用UUID保证每次创建新对象时生成全局唯一值:
import uuid from django.db import models class Gitinformation(models.Model): # 其他字段保持不变 request_id = models.UUIDField( default=uuid.uuid4, # 每次创建新实例自动生成新UUID unique=True, editable=False, # 禁止手动修改该字段 db_index=True ) # 其他字段保持不变
如果之前是用自定义逻辑生成request_id,改成UUID可以彻底避免重复值问题。
2. 修复视图逻辑,防止重复提交
你的视图存在冗余代码和重复提交风险,修改后的代码如下:
from django.shortcuts import redirect, render from django.core.mail import send_mail from rest_framework.decorators import api_view from .forms import GitInfoForm from .models import Gitinformation @api_view(['POST', 'GET']) def add_info_view(request): if request.method == 'POST': form = GitInfoForm(request.POST) if form.is_valid(): # 保存后直接获取实例,无需二次查询数据库 git_info_instance = form.save() # 直接从实例读取request_id,避免查询旧数据 approve_url = f"http://127.0.0.1:8000/Approve/?request_id={str(git_info_instance.request_id)}" try: send_mail( 'KSA Test Activation', approve_url, 'Noreplygcontrol@airlinq.com', ['sorav.parmar@airlinq.com'], fail_silently=False, ) request.session['approve_url'] = approve_url print('Approve Url sent : ', approve_url) except Exception as e: # 替换pass,记录错误便于排查 print(f"邮件发送失败: {str(e)}") # 使用POST/REDIRECT/GET模式,避免用户刷新页面重复提交 return redirect('add_info_view') # 确保urls.py中给该视图设置name='add_info_view' # GET请求时初始化表单 form = GitInfoForm() return render(request, 'requestApp/addInfo.html', {'form': form})
3. 额外排查点
- 如果
GitInfoForm中包含request_id字段,需在表单类中设置该字段不可编辑:class GitInfoForm(forms.ModelForm): class Meta: model = Gitinformation exclude = ['request_id'] # 直接排除该字段,或用隐藏组件 # 或 widgets = {'request_id': forms.HiddenInput()} - 检查是否有其他逻辑(如信号、后台任务)在修改
request_id字段,导致重复值出现。
内容的提问来源于stack exchange,提问作者Shaurya Rajput
相关产品推荐
相关产品推荐

