Почему Django get_or_create вызывает эту IntegrityError?

У меня есть модель с этим полем:
token = models.CharField (max_length = 32, default = "", unique = True, null = False, db_index = True)

В методе save () я установил это поле в случайную строку из 32 символов с помощью этого метода:

def save(self, *args, **kwargs):
    if (self.token is None or len(self.token) == 0):
        self.token = random_identifier()
    super(SessionPassthrough, self).save(*args, **kwargs)

def random_identifier(n=32):
    """ Generate a random identifier of length n. 

    From http://stackoverflow.com/questions/2257441/python-random-string-generation-with-upper-case-letters-and-digits"""
    return ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(n))

Однако я получаю эту ошибку всякий раз, когда пытаюсь создать новый экземпляр модели:
IntegrityError: повторяющееся значение ключа нарушает уникальное ограничение "wakelytics_sessionpassthrough_token_key"

Для создания экземпляра я вызываю этот метод:

@staticmethod
def for_session(session):
    sp, c = SessionPassthrough.objects.get_or_create(session=session)
    return sp

Вызывает ли get_or_create () функцию метода save () перед записью в базу данных? Ответ: Да

Я получаю IntegrityError всякий раз, когда вызываю метод в первый раз с сеансом , и продолжаю получать ошибку в течение нескольких минут. Затем он возвращается правильно. Что вызывает это?

6
задан Mantas Vidutis 16 June 2011 в 02:22
поделиться