summaryrefslogtreecommitdiff
path: root/django/db/models/query_utils.py
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-01-27 13:30:29 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-01-27 13:30:29 +0000
commit58cd220f51d5e294cb9e67c12a6e9d08523e282f (patch)
treec87c968bb69215449924efe57e8b13d70acd4fa3 /django/db/models/query_utils.py
parent8e8d4b5888b73e5c0b2cfc77be4c6d5898546654 (diff)
Fixed #7270 -- Added the ability to follow reverse OneToOneFields in select_related(). Thanks to George Vilches, Ben Davis, and Alex Gaynor for their work on various stages of this patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12307 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/query_utils.py')
-rw-r--r--django/db/models/query_utils.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index 9f6083ce7e..8e804ec3ef 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -197,19 +197,29 @@ class DeferredAttribute(object):
"""
instance.__dict__[self.field_name] = value
-def select_related_descend(field, restricted, requested):
+def select_related_descend(field, restricted, requested, reverse=False):
"""
Returns True if this field should be used to descend deeper for
select_related() purposes. Used by both the query construction code
(sql.query.fill_related_selections()) and the model instance creation code
(query.get_cached_row()).
+
+ Arguments:
+ * field - the field to be checked
+ * restricted - a boolean field, indicating if the field list has been
+ manually restricted using a requested clause)
+ * requested - The select_related() dictionary.
+ * reverse - boolean, True if we are checking a reverse select related
"""
if not field.rel:
return False
- if field.rel.parent_link:
- return False
- if restricted and field.name not in requested:
+ if field.rel.parent_link and not reverse:
return False
+ if restricted:
+ if reverse and field.related_query_name() not in requested:
+ return False
+ if not reverse and field.name not in requested:
+ return False
if not restricted and field.null:
return False
return True