Actualización del modelo django a través de kwargs.

¿Cómo puedo pasar un dictado que contiene campos para actualizar un modelo de Django? Esto no es para crear un objeto, sino para actualizarlo.

ejemplo:

obj = Object.objects.create(index=id, **fields) 

Mientras la PK sea la misma, la fila existente se sobrescribirá.

 obj = Object(index=id, **fields) obj.save() 
 def update_object(obj, **kwargs): for k, v in kwargs.items(): setattr(obj, k, v) obj.save() 

Puede obtener un queryset de un objeto y luego actualizar esto:

 model = Model.objects.filter(pk=pk) model.update(**kwargs) 

Sin embargo, esto no llamará al método .save () en el objeto. Sin embargo, creo que solo hará una consulta de base de datos.

Tenga en cuenta que si no filtra a un objeto (es decir, la consulta obtuvo varios objetos, como si no estuviera consultando en PK), los actualizaría a todos. Si se filtra a ninguno, entonces no se escribirá nada en la base de datos.

Habiendo dicho eso, no estaba al tanto de la solución de Ignacio. Me gusta bastante eso.

Esta pregunta es un poco antigua, pero solo para actualizarla con los desarrollos recientes de Django: desde la update_or_create 1.7 ha habido un método update_or_create en querysets que funciona de manera similar a get_or_create .

En este caso podría ser utilizado como:

 obj, created = Object.objects.update_or_create(index=id, defaults=fields) 

Si sabes que quieres crearlo:

 Book.objects.create(**fields) 

Suponiendo que necesite verificar una instancia existente, puede encontrarla con obtener o crear:

 instance, created = Book.objects.get_or_create(slug=slug, defaults=fields) if not created: for attr, value in fields.iteritems(): setattr(instance, attr, value) instance.save() 

Como se mencionó en otra respuesta, también puede usar la función de update en el administrador de consultas, pero creo que no enviará ninguna señal (lo que puede no importarle si no las está usando). Sin embargo, probablemente no deberías usarlo para alterar un solo objeto:

 Book.objects.filter(id=id).update(**fields) 

simplemente puede actualizar utilizando métodos después de la consulta filter()

 obj = Object.objects.filter(index=id).update(**fields) # fields your object(dict) may be **kwargs 

si es un método .get (),

 obj = Object.objects.get(index=id) obj['key1'] = 'value1' obj.save()