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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:10:27