Дублирование первичных ключей в 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)
# …
Замена идентификатора решила проблему
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)