117👍
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 thedefaults
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
65👍
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
- [Django]-Substring in a django template?
- [Django]-DatabaseError: current transaction is aborted, commands ignored until end of transaction block?
- [Django]-What's the difference between ContentType and MimeType?
47👍
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.
- [Django]-How to access array elements in a Django template?
- [Django]-"gettext()" vs "gettext_lazy()" in Django
- [Django]-How can I check the size of a collection within a Django template?
29👍
I don’t know how good or bad this is, but you can try something like this:
try:
obj = Model.objects.get(id=some_id)
except Model.DoesNotExist:
obj = Model.objects.create()
obj.__dict__.update(your_fields_dict)
obj.save()
- [Django]-Django optional URL parameters
- [Django]-Django QuerySet order
- [Django]-Django – why is the request.POST object immutable?
12👍
Here’s a mixin that you can mix into any model class which gives each instance an update
method:
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())
The self._state.adding
check checks to see if the model is saved to the database, and if not, raises an error.
(Note: This update
method is for when you want to update a model and you know the instance is already saved to the database, directly answering the original question. The built-in update_or_create
method featured in Platinum Azure’s answer already covers the other use-case.)
You would use it like this (after mixing this into your user model):
user = request.user
user.update(favorite_food="ramen")
Besides having a nicer API, another advantage to this approach is that it calls the pre_save
and post_save
hooks, while still avoiding atomicity issues if another process is updating the same model.
- [Django]-NumPy array is not JSON serializable
- [Django]-How do I get the class of a object within a Django template?
- [Django]-South migration: "database backend does not accept 0 as a value for AutoField" (mysql)
5👍
As @Nils mentionned, you can use the update_fields
keyword argument of the save()
method to manually specify the fields to update.
obj_instance = Model.objects.get(field=value)
obj_instance.field = new_value
obj_instance.field2 = new_value2
obj_instance.save(update_fields=['field', 'field2'])
The update_fields
value should be a list of the fields to update as strings.
See https://docs.djangoproject.com/en/2.1/ref/models/instances/#specifying-which-fields-to-save
- [Django]-How can I use Django permissions without defining a content type or model?
- [Django]-How to disable Django's CSRF validation?
- [Django]-Django: Fat models and skinny controllers?
1👍
update:
1 – individual instance :
get instance and update manually get() retrieve individual object
post = Post.objects.get(id=1)
post.title = "update title"
post.save()
2 – Set of instances :
use update() method that works only with queryset that what would be returned by filter() method
Post.objects.filter(author='ahmed').update(title='updated title for ahmed')
- [Django]-Write only, read only fields in django rest framework
- [Django]-How do I use django rest framework to send a file in response?
- [Django]-Auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserManage.groups'
0👍
I am using the following code in such cases:
obj, created = Model.objects.get_or_create(id=some_id)
if not created:
resp= "It was created"
else:
resp= "OK"
obj.save()
- [Django]-How to override css in Django Admin?
- [Django]-Setting the selected value on a Django forms.ChoiceField
- [Django]-Heroku, postgreSQL, django, comments, tastypie: No operator matches the given name and argument type(s). You might need to add explicit type casts