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
相关产品推荐
相关产品推荐

