summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-07-27 01:18:23 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-07-27 01:18:23 +0000
commitf48855178daf8f924338f8df322353797ce30081 (patch)
tree32dd42df9939b5b01a7691213f6ec365bda16ab2
parentaee55ce5249fdc822d6bd4ec5238a3154a217dcb (diff)
Fixed #7530, #7716 -- When using select_related() and encountering a NULL
related object, populate the attribute correctly. Patch from Bastien Kleineidam. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8098 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/query.py6
-rw-r--r--tests/regressiontests/null_fk/models.py18
2 files changed, 14 insertions, 10 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index f0a0cf8218..2aa5b33c74 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -785,7 +785,11 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
restricted = requested is not None
index_end = index_start + len(klass._meta.fields)
- obj = klass(*row[index_start:index_end])
+ fields = row[index_start:index_end]
+ if not [x for x in fields if x is not None]:
+ # If we only have a list of Nones, there was not related object.
+ return None, index_end
+ obj = klass(*fields)
for f in klass._meta.fields:
if not select_related_descend(f, restricted, requested):
continue
diff --git a/tests/regressiontests/null_fk/models.py b/tests/regressiontests/null_fk/models.py
index 1bc266c033..529dde5039 100644
--- a/tests/regressiontests/null_fk/models.py
+++ b/tests/regressiontests/null_fk/models.py
@@ -1,8 +1,5 @@
"""
-Regression tests for proper working of ForeignKey(null=True). Tests these bugs:
-
- * #7369: FK non-null after null relationship on select_related() generates an invalid query
-
+Regression tests for proper working of ForeignKey(null=True).
"""
from django.db import models
@@ -38,7 +35,8 @@ __test__ = {'API_TESTS':"""
# Starting from comment, make sure that a .select_related(...) with a specified
# set of fields will properly LEFT JOIN multiple levels of NULLs (and the things
-# that come after the NULLs, or else data that should exist won't).
+# that come after the NULLs, or else data that should exist won't). Regression
+# test for #7369.
>>> c = Comment.objects.select_related().get(id=1)
>>> c.post
<Post: First Post>
@@ -47,9 +45,11 @@ __test__ = {'API_TESTS':"""
None
>>> comments = Comment.objects.select_related('post__forum__system_info').all()
->>> [(c.id, c.post.id) for c in comments]
-[(1, 1), (2, None)]
->>> [(c.comment_text, c.post.title) for c in comments]
-[(u'My first comment', u'First Post'), (u'My second comment', None)]
+>>> [(c.id, c.comment_text, c.post) for c in comments]
+[(1, u'My first comment', <Post: First Post>), (2, u'My second comment', None)]
+
+# Regression test for #7530, #7716.
+>>> Comment.objects.select_related('post').filter(post__isnull=True)[0].post is None
+True
"""}