Fixed #6641 -- If we lose a race when creating a new object in get_or_create,

re-get the result from the database and return that. Thanks, Jeff Guinness and
Timothée Peignier.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7289 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-03-18 14:08:40 +00:00
parent e5342282cc
commit 1b331f6c1e
1 changed files with 9 additions and 6 deletions

View File

@ -1,5 +1,5 @@
from django.conf import settings from django.conf import settings
from django.db import connection, transaction from django.db import connection, transaction, IntegrityError
from django.db.models.fields import DateField, FieldDoesNotExist from django.db.models.fields import DateField, FieldDoesNotExist
from django.db.models import signals, loading from django.db.models import signals, loading
from django.dispatch import dispatcher from django.dispatch import dispatcher
@ -285,11 +285,14 @@ class _QuerySet(object):
try: try:
return self.get(**kwargs), False return self.get(**kwargs), False
except self.model.DoesNotExist: except self.model.DoesNotExist:
params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) try:
params.update(defaults) params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
obj = self.model(**params) params.update(defaults)
obj.save() obj = self.model(**params)
return obj, True obj.save()
return obj, True
except IntegrityError, e:
return self.get(**kwargs), False
def latest(self, field_name=None): def latest(self, field_name=None):
""" """