首页 > 解决方案 > 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'")

标签: pythondjangodjango-modelsdjango-forms

解决方案


如果您与以下人员一起工作:

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)
    # …

推荐阅读