Почему я получаю ошибку " дублирующее значение ключа нарушает уникальное ограничение "" DETAIL: Ключ (id_application)=(PR-1005576039) уже существует
my models.py
def document_id():
random_numbers = random.randint(1000000000, 1009999999)
doc_id = "PR-" + str(random_numbers)
return doc_id
class Document(models.Model):
id_application = models.CharField(default=document_id(), unique=True, editable=False)
applicant_name = models.CharField(max_length=100)
to_whom = models.CharField(max_length=255, blank=False)
comment = models.TextField(blank=False)
email = models.EmailField(blank=False)
through_whom = models.CharField(max_length=255, blank=False)
creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
status = models.CharField(max_length=255, choices=STATUS_CHOICES, default='Pending')
is_private = models.BooleanField(default=False)
stage = models.CharField(max_length=255, choices=STAGES, default='Departmental Review')
uploaded_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Проблема возникает каждые два раза, когда я создаю приложение документа, по некоторым причинам оно использует идентификатор последнего приложения документа. Я использую базу данных postgresql.
Ваша проблема в этой строке:
id_application = models.CharField(default=document_id(), unique=True, editable=False)
Хотя интуитивно может показаться, что document_id()
вызывается каждый раз, когда вы создаете новый экземпляр Document
, это не так. Это оценивается только один раз, и в дальнейшем случайно сгенерированное значение будет тем же самым. Поэтому, если вы не указали значение для id_application
при инстанцировании модели, вы получите ошибку дублирования значения при создании второго экземпляра.
Чтобы избежать этого, вам нужно предоставить значение по умолчанию в __init__
модели вместо этого и удалить default
kwarg из определения поля для ясности.
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.id_application is None:
self.id_application = document_id()
Или вы также можете передать функцию по умолчанию, и она будет вызываться при создании каждого объекта. См. документацию .
# Note that there are no parenthesis
id_application = models.CharField(default=document_id, unique=True, editable=False)