diff options
| author | Tim Graham <timgraham@google.com> | 2013-05-24 13:30:37 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2013-05-27 07:57:06 -0400 |
| commit | 6f8627dd7fd482007694dd1e4a99f9e207e6d8c2 (patch) | |
| tree | 61f000fd4889877afbb594b0c94397bc85772814 | |
| parent | 37ea9f9c03b8ec4305ac978e85db653b432b9921 (diff) | |
Fixed #17582 - Added message to DoesNotExist exceptions.
Thanks simon@ for the suggestion and JordanPowell
for the initial patch.
| -rw-r--r-- | django/db/models/fields/related.py | 7 | ||||
| -rw-r--r-- | docs/releases/1.6.txt | 3 | ||||
| -rw-r--r-- | tests/foreign_object/tests.py | 5 | ||||
| -rw-r--r-- | tests/one_to_one/tests.py | 3 |
4 files changed, 15 insertions, 3 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index fd0b24433f..fb38aa9c57 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -201,7 +201,9 @@ class SingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjectDescri setattr(rel_obj, self.related.field.get_cache_name(), instance) setattr(instance, self.cache_name, rel_obj) if rel_obj is None: - raise self.related.model.DoesNotExist + raise self.related.model.DoesNotExist("%s has no %s." % ( + instance.__class__.__name__, + self.related.get_accessor_name())) else: return rel_obj @@ -304,7 +306,8 @@ class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjec setattr(rel_obj, self.field.related.get_cache_name(), instance) setattr(instance, self.cache_name, rel_obj) if rel_obj is None and not self.field.null: - raise self.field.rel.to.DoesNotExist + raise self.field.rel.to.DoesNotExist( + "%s has no %s." % (self.field.model.__name__, self.field.name)) else: return rel_obj diff --git a/docs/releases/1.6.txt b/docs/releases/1.6.txt index 825c5dc28d..73b0fb85eb 100644 --- a/docs/releases/1.6.txt +++ b/docs/releases/1.6.txt @@ -277,6 +277,9 @@ Minor features a ``SuspiciousOperation`` reaches the WSGI handler to return an ``HttpResponseBadRequest``. +* The :exc:`~django.core.exceptions.DoesNotExist` exception now includes a + message indicating the name of the attribute used for the lookup. + Backwards incompatible changes in 1.6 ===================================== diff --git a/tests/foreign_object/tests.py b/tests/foreign_object/tests.py index 55dd6a0f47..69636ee49b 100644 --- a/tests/foreign_object/tests.py +++ b/tests/foreign_object/tests.py @@ -316,6 +316,11 @@ class MultiColumnFKTests(TestCase): list(Article.objects.filter(active_translation__abstract=None)), [a1, a2]) + def test_foreign_key_raises_informative_does_not_exist(self): + referrer = ArticleTranslation() + with self.assertRaisesMessage(Article.DoesNotExist, 'ArticleTranslation has no article'): + referrer.article + class FormsTests(TestCase): # ForeignObjects should not have any form fields, currently the user needs # to manually deal with the foreignobject relation. diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py index 6ee78520bd..a36764b788 100644 --- a/tests/one_to_one/tests.py +++ b/tests/one_to_one/tests.py @@ -22,7 +22,8 @@ class OneToOneTests(TestCase): # A Place can access its restaurant, if available. self.assertEqual(repr(self.p1.restaurant), '<Restaurant: Demon Dogs the restaurant>') # p2 doesn't have an associated restaurant. - self.assertRaises(Restaurant.DoesNotExist, getattr, self.p2, 'restaurant') + with self.assertRaisesMessage(Restaurant.DoesNotExist, 'Place has no restaurant'): + self.p2.restaurant def test_setter(self): # Set the place using assignment notation. Because place is the primary |
