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

Django表单提交出现主键重复报错,如何设置每次生成随机UUID?

问题根因

你当前模型中ID字段的default参数直接传入了str(uuid.uuid4()).replace('-', '')执行后的结果,这个值会在Django服务启动、加载模型类的时候被一次性计算出来,之后所有新建的实例如果没有手动传入ID,都会复用这个固定值,最终导致主键重复报错。

修复方案

方案1:修改default为可调用对象(适配现有存储逻辑,推荐)

将default参数改为传入可调用的函数对象,Django每次创建新实例时都会自动调用该函数生成全新的UUID,不会复用旧值。
首先定义独立的UUID生成函数:

import uuid
def generate_no_hyphen_uuid():
    return str(uuid.uuid4()).replace('-', '')

修改模型的ID字段配置,注意default只传函数名,不要加括号:

class TbTerminalPermission(models.Model):
    id = models.CharField(
        primary_key=True, default=generate_no_hyphen_uuid, max_length=60)
    # 其余字段保持不变

因为你的模型配置了managed = False,修改default属性不需要执行数据库迁移,重启服务即可生效。

方案2:使用Django原生UUIDField(更规范,可选)

如果你使用的数据库支持UUID类型(MySQL 8.0+、PostgreSQL等),可以直接用Django自带的UUIDField,无需自己实现生成逻辑:

import uuid
class TbTerminalPermission(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 其余字段保持不变

注意:该方案会修改字段类型,因为你的模型managed = False,需要手动修改数据库表的字段类型适配

冗余配置说明

你当前模型的unique_together配置了('id', 'terminal', 'user'),但ID本身是主键,已经全局唯一,这个联合唯一约束属于冗余配置,可以根据业务需要考虑移除。

内容的提问来源于stack exchange,提问作者kakakakakakakk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:57:02