Почему Django get_or_create вызывает эту ошибку IntegrityError? - PullRequest
5 голосов
/ 16 июня 2011

У меня есть модель с этим полем:
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 /1924709/generatsiya-sluchainoi-stroki-s-zaglavnymi-bukvami-i-tsiframi"""
    return ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(n))

Однако я получаю эту ошибку всякий раз, когда пытаюсь создать новый экземпляр модели:
IntegrityError: duplicate key value violates unique constraint "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 всякий раз, когда я вызываю метод в первый раз с session, и продолжаю получать ошибку в течение нескольких минут.Затем он возвращается правильно.Что вызывает это?

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Да.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

Из документов:

Новый объект будет создан примерно согласно этому алгоритму:

defaults = kwargs.pop('defaults', {})
params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
params.update(defaults)
obj = self.model(**params)
obj.save()
1 голос
/ 16 июня 2011

Конечно, это так.Часть его контракта заключается в том, что он будет возвращать модель, которая существует , и для этого ему необходимо сохранить.

РЕДАКТИРОВАТЬ:

Вы получаете эту ошибку, потому что значение уже существует в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...