2013-09-20 1 views
0

Мой экземпляр, кажется, сохраняется, когда я вызываю метод save. Проблема: экземпляр уже существует в моей базе данных!модель экземпляра существует, но «сохранена» в любом случае

Моя модель:

class DosIdModel(models.Model): 
    dosId = models.IntegerField(max_length=7, primary_key=True) 
    proposOrigine = models.CharField(max_length=4) 
    proposAnnee = models.IntegerField(max_length=4) 
    proposChrono = models.CharField(max_length=7) 
    splitNumber = models.IntegerField(max_length=1, blank=True, null=True, default=None) 

Мое мнение:

instance = DosIdModel() 
instance.dosId=int(row[0]) 
instance.proposOrigine=row[1].strip() 
instance.proposAnnee=int(row[2]) 
instance.proposChrono=row[3].strip() 
instance.splitNumber=emptyOrVar(row[4], "int") 
msg=(instance.dosId) 

savedList=[] 
errors_list=[] 
try: 
    print "exist: ", DosIdModel.objects.get(dosId=instance.dosId).dosId 
    instance.save() 
    print "saved" 
    savedList.append(msg) 
    print "end try" 
except IntegrityError, e: 
    print "except" 
    error= "The row " + str(msg) + " already exists!!" 

Результат в консоли:

exist: 104486 
saved 
end try 

Что не так?

+0

Извините, не знаю, что этот фрагмент кода пытается продемонстрировать. –

+1

Почему это проблема? По-видимому, уже есть запись с тем же «dosId». Поэтому '.save()' будет просто обновлять эту запись. – jproffitt

+0

Если вы работаете с данными из форм, вам лучше использовать интегрированные формы ... – Jingo

ответ

1

Просмотрите документацию на How Django knows to UPDATE vs. INSERT. В частности:

Если атрибут первичного ключа объекта устанавливается в значение, которое вычисляется как истина ... Django выполняет запрос SELECT, чтобы определить, существует ли уже запись с заданным ключом первичного . Если запись с данным первичным ключом уже существует, Django выполняет запрос UPDATE .... Тот, который получил здесь, заключается в том, что вы должны быть осторожны, чтобы не явно указать значение первичного ключа при сохранении новых объектов, если вы не можете гарантия значение первичного ключа не используется.

Вы можете получить поведение, которое вы ищете с помощью instance.save(force_insert=True) - которая заставит ВСТАВКУ в свою очередь, должно повысить IntegrityError вы ожидали.

Обратите внимание, что вы идете против зерна. Вот что говорят документы о force_insert:

Это должно быть очень редко, что вам нужно будет использовать эти параметры. Django будет почти всегда поступать правильно и пытается переопределить это приведет к ошибкам, которые сложно отследить. Эта функция предназначена только для расширенного использования.

+0

Действительно, я неправильно понял метод 'save'. Я использую этот код для многих моделей с разными ограничениями уникальности, поэтому в итоге я использовал 'force_insert = True'. Кажется, работает :). спасибо – rom

Смежные вопросы