diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-24 03:59:38 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-24 03:59:38 +0000 |
| commit | fd46f673bd83d8ed26ed54075439236e65f2d015 (patch) | |
| tree | 7c9d0b73d022029c5f2700a1af7039f6ff53d969 /django/db/models/sql/query.py | |
| parent | c5aa6fa71067b001c1d549b33ac4e2b409a70c75 (diff) | |
Fixed #9926 -- Fixes for some select_related() situations.
Using select_related(...) across a nullable relation to a multi-table
model inheritance situation no longer excludes results. Thanks to AdamG
for a test demonstrating part of the problem.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10136 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/sql/query.py')
| -rw-r--r-- | django/db/models/sql/query.py | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index b7e39847b0..0583386000 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -770,6 +770,7 @@ class BaseQuery(object): continue if as_pairs: result.append((alias, field.column)) + aliases.add(alias) continue if with_aliases and field.column in col_aliases: c_alias = 'Col%d' % len(col_aliases) @@ -784,7 +785,7 @@ class BaseQuery(object): if with_aliases: col_aliases.add(field.column) if as_pairs: - return result, None + return result, aliases return result, aliases def get_from_clause(self): @@ -1342,6 +1343,7 @@ class BaseQuery(object): if model: int_opts = opts alias = root_alias + alias_chain = [] for int_model in opts.get_base_chain(model): lhs_col = int_opts.parents[int_model].column dedupe = lhs_col in opts.duplicate_targets @@ -1353,8 +1355,11 @@ class BaseQuery(object): alias = self.join((alias, int_opts.db_table, lhs_col, int_opts.pk.column), exclusions=used, promote=promote) + alias_chain.append(alias) for (dupe_opts, dupe_col) in dupe_set: self.update_dupe_avoidance(dupe_opts, dupe_col, alias) + if self.alias_map[root_alias][JOIN_TYPE] == self.LOUTER: + self.promote_alias_chain(alias_chain, True) else: alias = root_alias @@ -1368,8 +1373,11 @@ class BaseQuery(object): f.rel.get_related_field().column), exclusions=used.union(avoid), promote=promote) used.add(alias) - self.related_select_cols.extend(self.get_default_columns( - start_alias=alias, opts=f.rel.to._meta, as_pairs=True)[0]) + columns, aliases = self.get_default_columns(start_alias=alias, + opts=f.rel.to._meta, as_pairs=True) + self.related_select_cols.extend(columns) + if self.alias_map[alias][JOIN_TYPE] == self.LOUTER: + self.promote_alias_chain(aliases, True) self.related_select_fields.extend(f.rel.to._meta.fields) if restricted: next = requested.get(f.name, {}) |
