template examples context bootstrap python django models

python - context - django templates examples



Django: ¿Llamar a.update() en una única instancia de modelo recuperada por.get()? (6)

A partir de Django 1.5, hay una propiedad update_fields en el modelo de guardar. p.ej:

obj.save(update_fields=[''field1'', ''field2'', ...])

https://docs.djangoproject.com/en/dev/ref/models/instances/

Prefiero este enfoque porque no crea un problema de atomicidad si tiene varias instancias de aplicaciones web que cambian diferentes partes de una instancia de modelo.

Tengo una función que actualmente llama a Models.object.get() , que devuelve 0 o 1 objetos del modelo. Si devuelve 0, creo una nueva instancia de modelo en la cláusula except DoesNotExist de la función. De lo contrario, me gustaría actualizar los campos en la instancia preexistente, sin crear una nueva. .update() originalmente llamar a .update() en la instancia que se encontró, pero .update() parece ser solo invocable en un QuerySets. ¿Cómo puedo cambiar una docena de campos sin llamar a .filter() y comparar las longitudes para saber si tengo que crear o actualizar una instancia preexistente?


Aquí hay una mezcla que puedes mezclar en cualquier clase de modelo que le da a cada instancia un método de update :

class UpdateMixin(object): def update(self, **kwargs): if self._state.adding: raise self.DoesNotExist for field, value in kwargs.items(): setattr(self, field, value) self.save(update_fields=kwargs.keys())

La comprobación self._state.adding comprueba si el modelo se guarda en la base de datos y, de lo contrario, genera un error.

(Nota: Este método de update es para cuando desea actualizar un modelo y sabe que la instancia ya está guardada en la base de datos, respondiendo directamente a la pregunta original. El método update_or_create incluido en la respuesta de Platinum Azure ya cubre el otro uso caso.)

Lo usaría así (después de mezclar esto en su modelo de usuario):

user = request.user user.update(favorite_food="ramen")

Además de tener una API más agradable, otra ventaja de este enfoque es que llama a los ganchos pre_save y post_save , al mismo tiempo que evita problemas de atomicidad si otro proceso está actualizando el mismo modelo.


Con el advenimiento de Django 1.7, ahora hay un nuevo método update_or_create QuerySet que debería hacer exactamente lo que usted desea. Solo tenga cuidado con las posibles condiciones de carrera si la exclusividad no se aplica a nivel de la base de datos.

Ejemplo de la documentación:

obj, created = Person.objects.update_or_create( first_name=''John'', last_name=''Lennon'', defaults=updated_values)

Pre-Django 1.7:

Cambie los valores del campo del modelo según corresponda, luego llame a .save() para conservar los cambios:

try: obj = Model.objects.get(field=value) obj.field = new_value obj.save() except Model.DoesNotExist: obj = Model.objects.create(field=new_value) # do something else with obj if need be


Estoy usando el siguiente código en tales casos:

obj, created = Model.objects.get_or_create(id=some_id) if not created: resp= "It was created" else: resp= "OK" obj.save()


No sé qué tan bueno o malo es esto, pero puedes intentar algo como esto:

Model.objects.filter(id = 223).update(field1 = 2)


si solo desea actualizar el modelo si existe (sin crearlo):

UPDATE `model` SET `field1` = 2 WHERE `model`.`id` = 223

consulta mysql:

try: obj = Model.objects.get(id=some_id) except Model.DoesNotExist: obj = Model.objects.create() obj.__dict__.update(your_fields_dict) obj.save()