diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2010-01-27 13:30:29 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2010-01-27 13:30:29 +0000 |
| commit | 58cd220f51d5e294cb9e67c12a6e9d08523e282f (patch) | |
| tree | c87c968bb69215449924efe57e8b13d70acd4fa3 /django/db/models/query_utils.py | |
| parent | 8e8d4b5888b73e5c0b2cfc77be4c6d5898546654 (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.py | 18 |
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 |
