Quiero crear un objeto modelo, como Persona, si la identificación de la persona no existe, o obtendré ese objeto de persona.
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.
python
django
django-models
user1687717
fuente
fuente
QuerySet
tieneupdate_or_create
No está claro si su pregunta solicita el 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 desee actualizar el objeto de usuario.
El uso de muestra es el siguiente:
fuente
update_or_create
porque para ese caso de uso es mejor queget_or_create
simplemente llamarsave()
al objeto nuevamente.Person.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
defaults
argumento de estas funciones es donde especifica qué campos desea agregar al modelo. No tiene nada que ver con los valores predeterminados especificados en los campos de su modeloDjango tiene soporte para esto, verifique get_or_create
fuente
Para solo una pequeña cantidad de objetos, update_or_create funciona bien, pero si lo está haciendo sobre una colección grande, no escalará bien. update_or_create siempre ejecuta primero un SELECT y luego un UPDATE.
Esto, en el mejor de los casos, solo ejecutará la primera consulta de actualización, y solo si coincide con cero filas ejecutará otra consulta INSERT. Lo que aumentará enormemente su rendimiento si espera que la mayoría de las filas existan realmente.
Sin embargo, todo se reduce a su caso de uso. Si está esperando mayormente inserciones, quizás el comando bulk_create () podría ser una opción.
fuente
Pensé que agregaría una respuesta, ya que el título de su pregunta parece preguntar 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 por defecto, de los documentos :
Vale la pena señalar que cuando dicen 'si la ACTUALIZACIÓN no actualizó nada', esencialmente se refieren al caso en el que la identificación que le dio al objeto no existe ya en la base de datos.
fuente
Si una de las entradas cuando crea es una clave principal, esto será suficiente:
Se actualizará automáticamente si existe, ya que no se permiten dos datos con la misma clave primaria.
fuente