sortable_by positional on_delete missing init__ argument python django

python - on_delete - __ init__ missing 1 required positional argument sortable_by



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

¿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)


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)


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

obj = Object(index=id, **fields) 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.


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()


def update_object(obj, **kwargs): for k, v in kwargs.items(): setattr(obj, k, v) obj.save()