Почему я получаю ошибку " дублирующее значение ключа нарушает уникальное ограничение "" 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)
Вернуться на верх