Django get_or_create повышает дубликат записи для ключа Primary со значениями по умолчанию - PullRequest
3 голосов
/ 30 августа 2011

Помощь!Не могу понять это!Я получаю ошибку целостности в get_or_create даже с установленным параметром по умолчанию.

Вот как выглядит модель в урезанном виде.

class Example(models.Model):model
    user            = models.ForeignKey(User)
    text            = models.TextField()

def __unicode__(self):
    return "Example"

Я запускаю это в Django:

def create_example_model(user, textJson):
    defaults = {text: textJson.get("text", "undefined")}

    model, created = models.Example.objects.get_or_create(
            user=user, 
            id=textJson.get("id", None), 
            defaults=defaults)

    if not created:
        model.text = textJson.get("text", "undefined")
        model.save()

    return model

Я получаю сообщение об ошибке в строке get_or_create:

IntegrityError: (1062, "Duplicate entry '3020' for key 'PRIMARY'")

Он активен, поэтому я не могу точно сказать, что это за ввод.

Помощь?Там на самом деле установлены значения по умолчанию, так что это не похоже на эту проблему, когда у них нет значений по умолчанию.Плюс это не имеет вместе уникальность. Django: get_or_create Поднимает дублирующую запись вместе с Together_unique

Я использую Python 2.6 и mysql.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

get_or_create() попытается создать новый объект, если не сможет найти объект, который точный соответствует аргументам, которые вы передаете.

Так вот, что япредполагается, что происходит то, что другой пользователь создал объект с идентификатором 3020. Так как нет объекта с комбо-запросом user / id, который вы запрашиваете, он пытается создать новый объект с этим комбо, но терпит неудачу, потому что другойПользователь уже создал элемент с идентификатором 3020.

Надеюсь, это имеет смысл.Посмотрите, что возвращает следующее.Может дать немного понимания того, что произошло.

models.Example.objects.get(id=3020)

Возможно, вам понадобится сделать строку 3020 в поиске.Я предполагаю, что строка возвращается из вашего textJson.get() метода.

1 голос
/ 30 августа 2011

Вы не должны устанавливать идентификатор для объектов в целом, вы должны быть осторожны при этом.

Вы проверили, чтобы увидеть значение 'id', которое вы помещаете в базу данных?

Если это не решит вашу проблему, то это может быть проблема с базой данных, для PostgreSQL есть специальная последовательность, используемая для увеличения идентификаторов, и иногда это не увеличивается. Примерно так:

SELECT setval ('tablename_id_seq', (SELECT MAX (id) + 1 ОТ tablename_id_seq));

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