Django: Calling .update() on a single model instance retrieved by .get()? Django: Calling .update() on a single model instance retrieved by .get()? django django

Django: Calling .update() on a single model instance retrieved by .get()?


With the advent of Django 1.7, there is now a new update_or_create QuerySet method, which should do exactly what you want. Just be careful of potential race conditions if uniqueness is not enforced at the database level.

Example from the documentation:

obj, created = Person.objects.update_or_create(    first_name='John', last_name='Lennon',    defaults={'first_name': 'Bob'},)

The update_or_create method tries to fetch an object from database based on the given kwargs. If a match is found, it updates the fields passed in the defaults dictionary.


Pre-Django 1.7:

Change the model field values as appropriate, then call .save() to persist the changes:

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


if you want only to update model if exist (without create it):

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

mysql query:

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


As of Django 1.5, there is an update_fields property on model save. eg:

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

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

I prefer this approach because it doesn't create an atomicity problem if you have multiple web app instances changing different parts of a model instance.