Author: julien
Date: 2012-01-02 13:30:47 -0800 (Mon, 02 Jan 2012)
New Revision: 17333
Modified:
django/trunk/django/db/models/query.py
django/trunk/tests/modeltests/get_or_create/tests.py
Log:
Fixed #16340 -- Made `get_or_create()` re-raise any `IntegrityError` with its
original traceback. Thanks to d0ugal and Jonas Obrist.
Modified: django/trunk/django/db/models/query.py
===================================================================
--- django/trunk/django/db/models/query.py 2012-01-02 20:45:09 UTC (rev
17332)
+++ django/trunk/django/db/models/query.py 2012-01-02 21:30:47 UTC (rev
17333)
@@ -4,6 +4,7 @@
import copy
import itertools
+import sys
from django.db import connections, router, transaction, IntegrityError
from django.db.models.fields import AutoField
@@ -450,10 +451,12 @@
return obj, True
except IntegrityError, e:
transaction.savepoint_rollback(sid, using=self.db)
+ exc_info = sys.exc_info()
try:
return self.get(**lookup), False
except self.model.DoesNotExist:
- raise e
+ # Re-raise the IntegrityError with its original traceback.
+ raise exc_info[1], None, exc_info[2]
def latest(self, field_name=None):
"""
Modified: django/trunk/tests/modeltests/get_or_create/tests.py
===================================================================
--- django/trunk/tests/modeltests/get_or_create/tests.py 2012-01-02
20:45:09 UTC (rev 17332)
+++ django/trunk/tests/modeltests/get_or_create/tests.py 2012-01-02
21:30:47 UTC (rev 17333)
@@ -1,6 +1,7 @@
from __future__ import absolute_import
from datetime import date
+import traceback
from django.db import IntegrityError
from django.test import TestCase
@@ -52,3 +53,14 @@
ManualPrimaryKeyTest.objects.get_or_create, id=1, data="Different"
)
self.assertEqual(ManualPrimaryKeyTest.objects.get(id=1).data,
"Original")
+
+ # get_or_create should raise IntegrityErrors with the full traceback.
+ # This is tested by checking that a known method call is in the
traceback.
+ # We cannot use assertRaises/assertRaises here because we need to
inspect
+ # the actual traceback. Refs #16340.
+ try:
+ ManualPrimaryKeyTest.objects.get_or_create(id=1, data="Different")
+ except IntegrityError, e:
+ formatted_traceback = traceback.format_exc()
+ self.assertIn('obj.save', formatted_traceback)
+
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.