mirror of
https://github.com/django/django.git
synced 2025-09-26 12:09:19 +00:00
Fixed #26804 -- Fixed a race condition in QuerySet.update_or_create().
This commit is contained in:
parent
76e19da5b0
commit
d44afd8892
3 changed files with 62 additions and 11 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue