У меня есть приложение Django, которое считывает данные из веб-API и помещает их в базу данных.
Есть ли способ создать новый объект из режима, но предотвратить дублирование исключения, если объект уже существует?
Другими словами, есть ли способ сохранить объект, но ничего не делать, если он уже существует?
IntegrityError
приведет к прерыванию текущей транзакции, и этого недостаточно.transaction.atomic
(убедитесь , что вы ловите снаружи вatomic
блок, то естьtry: with acomic: create; except IntegrityError
это также сложно убедиться , что вы не ловите. другие ошибки целостности , чем тот , который вы намереныIntegrityError
, мое тестирование показывает, что оно сокращает время выполнения почти вдвое, когда существует запись, по сравнению сget_or_create()
.В Django 1.7 вы также можете:
Model.objects.update_or_create()
источник
Похоже, что в новых версиях Django функция save () по умолчанию выполняет UPDATE или INSERT. Смотрите здесь .
источник
Этого можно добиться с помощью
Model.objects.get_or_create()
пример
obj, created = Person.objects.get_or_create( first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}, )
Любые аргументы ключевого слова (здесь first_name и last_name ), переданные в get_or_create (), за исключением необязательного аргумента, называемого defaults, будут использоваться для запроса в базе данных (поиска объекта) в базе данных.
Он возвращает кортеж, если объект найден, get_or_create () возвращает кортеж этого объекта и False.
Примечание : того же можно добиться с помощью
try except
операторовПример:
try: obj = Person.objects.get(first_name='John', last_name='Lennon') except Person.DoesNotExist: obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) obj.save()
источник