diff options
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 |
