diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-27 01:18:23 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-27 01:18:23 +0000 |
| commit | f48855178daf8f924338f8df322353797ce30081 (patch) | |
| tree | 32dd42df9939b5b01a7691213f6ec365bda16ab2 | |
| parent | aee55ce5249fdc822d6bd4ec5238a3154a217dcb (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.py | 6 | ||||
| -rw-r--r-- | tests/regressiontests/null_fk/models.py | 18 |
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 """} |
