mirror of
https://github.com/django/django.git
synced 2025-10-30 09:06:13 +00:00
Fixed #26804 -- Fixed a race condition in QuerySet.update_or_create().
This commit is contained in:
committed by
Tim Graham
parent
76e19da5b0
commit
d44afd8892
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user