From 7a0b04fdc3abb8ff4db7ffc81d4a0201f682a82a Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sun, 12 Mar 2006 04:10:57 +0000 Subject: [PATCH] magic-removal: Modified descriptor to return None rather than raising DoesNotExist if null=True for a related field. git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2511 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/related.py | 3 +++ tests/modeltests/m2o_recursive/models.py | 6 ++---- tests/modeltests/many_to_one_null/models.py | 17 +++++++---------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index d60708496b..2c7bebc759 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -117,6 +117,9 @@ class ReverseSingleRelatedObjectDescriptor(object): except AttributeError: val = getattr(instance, self.field.attname) if val is None: + # If Null is an allowed value, return it. + if self.field.null: + return None raise self.field.rel.to.DoesNotExist other_field = self.field.rel.get_related_field() if other_field.rel: diff --git a/tests/modeltests/m2o_recursive/models.py b/tests/modeltests/m2o_recursive/models.py index 3c9c4d4b65..e7996bc15f 100644 --- a/tests/modeltests/m2o_recursive/models.py +++ b/tests/modeltests/m2o_recursive/models.py @@ -30,10 +30,8 @@ API_TESTS = """ [Child category] >>> r.child_set.get(name__startswith='Child') Child category ->>> r.parent -Traceback (most recent call last): - ... -DoesNotExist +>>> print r.parent +None >>> c.child_set.all() [] diff --git a/tests/modeltests/many_to_one_null/models.py b/tests/modeltests/many_to_one_null/models.py index 8a629aa137..6818493ee3 100644 --- a/tests/modeltests/many_to_one_null/models.py +++ b/tests/modeltests/many_to_one_null/models.py @@ -61,23 +61,20 @@ Second >>> a3.save() >>> a3.id 3 ->>> a3.reporter -Traceback (most recent call last): - ... -DoesNotExist +>>> print a3.reporter +None +# Need to reget a3 to refresh the cache >>> a3 = Article.objects.get(pk=3) >>> print a3.reporter.id Traceback (most recent call last): ... -DoesNotExist +AttributeError: 'NoneType' object has no attribute 'id' -# Accessing an article's 'reporter' attribute throws ReporterDoesNotExist +# Accessing an article's 'reporter' attribute returns None # if the reporter is set to None. ->>> a3.reporter -Traceback (most recent call last): - ... -DoesNotExist +>>> print a3.reporter +None # To retrieve the articles with no reporters set, use "reporter__isnull=True". >>> Article.objects.filter(reporter__isnull=True)