Fixed #26804 -- Fixed a race condition in QuerySet.update_or_create().

This commit is contained in:
Jensen Cochran 2016-06-24 12:08:42 -05:00 committed by Tim Graham
parent 76e19da5b0
commit d44afd8892
3 changed files with 62 additions and 11 deletions

View file

@ -482,15 +482,16 @@ class QuerySet(object):
defaults = defaults or {}
lookup, params = self._extract_model_params(defaults, **kwargs)
self._for_write = True
try:
obj = self.get(**lookup)
except self.model.DoesNotExist:
obj, created = self._create_object_from_params(lookup, params)
if created:
return obj, created
for k, v in six.iteritems(defaults):
setattr(obj, k, v() if callable(v) else v)
obj.save(using=self.db)
with transaction.atomic(using=self.db):
try:
obj = self.select_for_update().get(**lookup)
except self.model.DoesNotExist:
obj, created = self._create_object_from_params(lookup, params)
if created:
return obj, created
for k, v in six.iteritems(defaults):
setattr(obj, k, v() if callable(v) else v)
obj.save(using=self.db)
return obj, False
def _create_object_from_params(self, lookup, params):