为何创建文档时触发“重复键值违反唯一约束”错误?
解决"duplicate key value violates unique constraint"错误
问题根源
你代码里的id_application字段默认值设置错误:default=document_id()是直接执行函数并把结果作为固定默认值,Django启动时只会跑一次这个函数,所有新创建的文档都会复用同一个ID,自然触发唯一约束冲突。
修复步骤
修正默认值的传递方式
把default=document_id()改成default=document_id(去掉括号),这样每次创建新文档时,Django都会调用这个函数生成新的随机ID。(可选)添加重复检查,彻底避免碰撞
虽然你的随机数范围很大,重复概率低,但可以在生成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
相关产品推荐
相关产品推荐

