python - Django重复主键
问题描述
我有一个表单,它在提交后创建一个具有相同先前 id 的对象。如何每次将 uuid 更改为随机的?
class TbTerminalPermission(models.Model):
id = models.CharField(
primary_key=True, default=str(uuid.uuid4()).replace('-', ''), max_length=60)
terminal = models.ForeignKey(
'app.TbTerminal', on_delete=models.CASCADE, db_column='ter_id')
user = models.ForeignKey(
TbUser, on_delete=models.CASCADE, db_column='user_id')
class Meta:
managed = False
db_table = 'tb_terminal_permission'
unique_together = ('id', 'terminal', 'user')
class TbTerminalPermissionForm(forms.ModelForm):
class Meta:
model = TbTerminalPermission
fields = ['user', 'terminal']
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user = user
if self.user:
self.fields['user'].queryset = TbUser.objects.filter(
id=self.user.id)
self.fields['terminal'].queryset = TbTerminal.objects.exclude(
tbterminalpermission__user=self.user).filter(customer=self.user.customer)
错误
Exception Value:
(1062, "Duplicate entry 'ea870f29ec124e39aa5251b0862635f3' for key 'PRIMARY'")
解决方案
如果您与以下人员一起工作:
id = models.CharField(
primary_key=True,
default=str(uuid.uuid4()).replace('-', ''),
max_length=60
)
然后 Python 将评估str(uuid.uuid4()).replace('-', '')
一次,并在每次必须生成主键时将其用作默认值,因此如果您第二次保存对象,则会发生冲突。
您应该定义一个生成字符串的函数,并将对该函数的引用作为默认值传递,因此:
def gen_pk_perm():
return str(uuid.uuid4()).replace('-', '')
class TbTerminalPermission(models.Model):
id = models.CharField(primary_key=True, default=gen_pk_perm, max_length=60)
# …
推荐阅读
- lazy-evaluation - 计算在按名称调用和按需要调用下执行的中缀操作
- python - 根据 pyspark RDD 检查列表中的项目
- wpf - 2021 年的 WPF FolderBrowserDialog 中是否需要所有者窗口?
- python - 网页抓取问题,无法点击元素
- swift - Swift:文字隐式类型转换
- html - css/html:保持框在页面上的绝对位置
- c++ - 调用结构函数中的数组更改不起作用
- sequelize.js - 运行 supertest 时出错:测试完成后无法登录。您是否忘记在测试中等待异步内容?
- spring-boot - 无法连接到 docker 容器 localhost 连接被拒绝
- algorithm - 如何解释我的实验结果旨在找到插入排序和归并排序之间的阈值?