Tengo una aplicación Django que lee datos de una API web y los coloca en una base de datos.
¿Hay alguna forma de crear un nuevo objeto a partir de un modo pero evitar la excepción duplicada si el objeto ya existe?
En otras palabras, ¿hay alguna forma de guardar un objeto, pero no hacer nada si ya existe?
IntegrityError
hace que la transacción actual se anule y no es suficiente.transaction.atomic
(asegúrese de detectar fuera delatomic
bloque, es decirtry: with acomic: create; except IntegrityError
, también es complicado asegurarse de no detectar otros errores de integridad que no sea el que pretendeIntegrityError
, mis pruebas muestran que reduce el tiempo de ejecución casi a la mitad cuando existe el registro en comparación conget_or_create()
.En Django 1.7, también puede hacer:
Model.objects.update_or_create()
fuente
Parece que en las versiones más recientes de Django, la función save () realiza una ACTUALIZACIÓN o INSERT de forma predeterminada. Vea aquí .
fuente
Se puede lograr usando
Model.objects.get_or_create()
Ejemplo
obj, created = Person.objects.get_or_create( first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}, )
Cualquier argumento de palabra clave (aquí first_name y last_name ) pasado a get_or_create () - excepto uno opcional llamado defaults - se usará para consultar en la base de datos (encontrar el objeto) en la base de datos.
Devuelve una tupla, si se encuentra un objeto, get_or_create () devuelve una tupla de ese objeto y False.
Nota : Lo mismo también se puede lograr usando
try except
declaracionesEjemplo:
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()
fuente