update_or_create migraciones eliminar python django django-models

python - update_or_create - eliminar migraciones django



Crear modelo Django o actualizar si existe (5)

Quiero crear un objeto modelo, como Person, si la identificación de la persona no existe, o obtendré esa persona objeto.

El código para crear una nueva persona de la siguiente manera:

class Person(models.Model): identifier = models.CharField(max_length = 10) name = models.CharField(max_length = 20) objects = PersonManager() class PersonManager(models.Manager): def create_person(self, identifier): person = self.create(identifier = identifier) return person

Pero no sé dónde verificar y obtener el objeto de persona existente.



No está claro si su pregunta es para get_or_create método get_or_create (disponible al menos en Django 1.3) o el método update_or_create (nuevo en Django 1.7). Depende de cómo quiera actualizar el objeto del usuario.

El uso de la muestra es el siguiente:

# In both cases, the call will get a person object with matching # identifier or create one if none exists; if a person is created, # it will be created with name equal to the value in `name`. # In this case, if the Person already exists, its existing name is preserved person, created = Person.objects.get_or_create( identifier=identifier, defaults={"name": name} ) # In this case, if the Person already exists, its name is updated person, created = Person.objects.update_or_create( identifier=identifier, defaults={"name": name} )


Pensé que agregaría una respuesta ya que el título de su pregunta parece que está preguntando cómo crear o actualizar, en lugar de obtener o crear como se describe en el cuerpo de la pregunta.

Si desea crear o actualizar un objeto, el método .save () ya tiene este comportamiento de forma predeterminada, desde los documentos :

Django abstrae la necesidad de usar las sentencias INSERT o UPDATE SQL. Específicamente, cuando llamas a save (), Django sigue este algoritmo:

Si el atributo de clave principal del objeto se establece en un valor que se evalúa como Verdadero (es decir, un valor distinto de Ninguno o la cadena vacía), Django ejecuta una ACTUALIZACIÓN. Si el atributo de la clave principal del objeto no está establecido o si el UPDATE no actualizó nada, Django ejecuta un INSERT.

Vale la pena señalar que cuando dicen ''si la ACTUALIZACIÓN no actualizó nada'', se están refiriendo esencialmente al caso en el que el ID que le dio al objeto ya no existe en la base de datos.


Si está buscando el caso de uso "update if exists else create", consulte la excelente respuesta de @Zag.

Django ya tiene un get_or_create , https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

Para ti podría ser:

id = ''some identifier'' person, created = Person.objects.get_or_create(identifier=id) if created: # means you have created a new person else: # person just refers to the existing one


Si una de las entradas al crear es una clave principal, esto será suficiente:

Person.objects.get_or_create(id=1)

Se actualizará automáticamente si existe, ya que dos datos con la misma clave primaria no están permitidos.