summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-18 14:08:40 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-18 14:08:40 +0000
commit1b331f6c1eadc55e6efe014ec5f5b91df83961ff (patch)
tree9ebe882f89bad5029efe66f70ceeb6c9eebc43dc
parente5342282cc93f6178ed23eff19f5eda76dcd07c8 (diff)
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
-rw-r--r--django/db/models/query.py15
1 files changed, 9 insertions, 6 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 0bc36f425a..a3d00c2ead 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1,5 +1,5 @@
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 import signals, loading
from django.dispatch import dispatcher
@@ -285,11 +285,14 @@ class _QuerySet(object):
try:
return self.get(**kwargs), False
except self.model.DoesNotExist:
- params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
- params.update(defaults)
- obj = self.model(**params)
- obj.save()
- return obj, True
+ try:
+ params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
+ params.update(defaults)
+ obj = self.model(**params)
+ obj.save()
+ return obj, True
+ except IntegrityError, e:
+ return self.get(**kwargs), False
def latest(self, field_name=None):
"""