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

为何创建文档时触发“重复键值违反唯一约束”错误?

解决"duplicate key value violates unique constraint"错误

问题根源

你代码里的id_application字段默认值设置错误:default=document_id()是直接执行函数并把结果作为固定默认值,Django启动时只会跑一次这个函数,所有新创建的文档都会复用同一个ID,自然触发唯一约束冲突。

修复步骤

  1. 修正默认值的传递方式
    把default=document_id()改成default=document_id(去掉括号),这样每次创建新文档时,Django都会调用这个函数生成新的随机ID。

  2. (可选)添加重复检查,彻底避免碰撞
    虽然你的随机数范围很大,重复概率低,但可以在生成ID时主动检查数据库是否已存在,确保唯一性:

修改后的完整代码:

import random
from django.db import models
from django.conf import settings

def document_id():
    while True:
        random_numbers = random.randint(1000000000, 1009999999)
        doc_id = "PR-" + str(random_numbers)
        # 检查ID是否已存在,不存在则返回
        if not Document.objects.filter(id_application=doc_id).exists():
            return doc_id

class Document(models.Model):
    id_application = models.CharField(default=document_id, unique=True, editable=False)
    applicant_name = models.CharField(max_length=100)
    to_whom = models.CharField(max_length=255, blank=False)
    comment = models.TextField(blank=False)
    email = models.EmailField(blank=False)
    through_whom = models.CharField(max_length=255, blank=False)
    creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    status = models.CharField(max_length=255, choices=STATUS_CHOICES, default='Pending')
    is_private = models.BooleanField(default=False)
    stage = models.CharField(max_length=255, choices=STAGES, default='Departmental Review')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

说明

  • 去掉括号后,default接收的是函数引用,Django会在每次创建新实例时调用该函数生成新值。
  • 循环检查的逻辑可以确保即使极端情况下随机数重复,也能生成唯一的ID,彻底解决冲突问题。

内容的提问来源于stack exchange,提问作者Daevid The Great

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:05:31