summaryrefslogtreecommitdiff
path: root/django/db/models/sql/compiler.py
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2012-10-25 20:57:32 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2012-10-27 02:13:02 +0300
commit11699ac4b5f98ec11dba02b356a8fd4ab6b4b889 (patch)
treeb8b5f673020b2584ebd812451222de30994324c5 /django/db/models/sql/compiler.py
parent789ea3342d5cdfc850a2f68818e707cdc5111bb9 (diff)
Fixed #19190 -- Refactored Query select clause attributes
The Query.select and Query.select_fields were collapsed into one list because the attributes had to be always in sync. Now that they are in one attribute it is impossible to edit them out of sync. Similar collapse was done for Query.related_select_cols and Query.related_select_fields.
Diffstat (limited to 'django/db/models/sql/compiler.py')
-rw-r--r--django/db/models/sql/compiler.py28
1 files changed, 14 insertions, 14 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index b9095e503a..7461f5f31d 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -6,7 +6,7 @@ from django.db.backends.util import truncate_name
from django.db.models.constants import LOOKUP_SEP
from django.db.models.query_utils import select_related_descend
from django.db.models.sql.constants import (SINGLE, MULTI, ORDER_DIR,
- GET_ITERATOR_CHUNK_SIZE)
+ GET_ITERATOR_CHUNK_SIZE, SelectInfo)
from django.db.models.sql.datastructures import EmptyResultSet
from django.db.models.sql.expressions import SQLEvaluator
from django.db.models.sql.query import get_order_dir, Query
@@ -188,7 +188,7 @@ class SQLCompiler(object):
col_aliases = set()
if self.query.select:
only_load = self.deferred_to_columns()
- for col in self.query.select:
+ for col, _ in self.query.select:
if isinstance(col, (list, tuple)):
alias, column = col
table = self.query.alias_map[alias].table_name
@@ -233,7 +233,7 @@ class SQLCompiler(object):
for alias, aggregate in self.query.aggregate_select.items()
])
- for table, col in self.query.related_select_cols:
+ for (table, col), _ in self.query.related_select_cols:
r = '%s.%s' % (qn(table), qn(col))
if with_aliases and col in col_aliases:
c_alias = 'Col%d' % len(col_aliases)
@@ -557,8 +557,9 @@ class SQLCompiler(object):
for extra_select, extra_params in six.itervalues(self.query.extra_select):
extra_selects.append(extra_select)
params.extend(extra_params)
- cols = (group_by + self.query.select +
- self.query.related_select_cols + extra_selects)
+ select_cols = [s.col for s in self.query.select]
+ related_select_cols = [s.col for s in self.query.related_select_cols]
+ cols = (group_by + select_cols + related_select_cols + extra_selects)
seen = set()
for col in cols:
if col in seen:
@@ -589,7 +590,6 @@ class SQLCompiler(object):
opts = self.query.get_meta()
root_alias = self.query.get_initial_alias()
self.query.related_select_cols = []
- self.query.related_select_fields = []
if not used:
used = set()
if dupe_set is None:
@@ -664,8 +664,8 @@ class SQLCompiler(object):
used.add(alias)
columns, aliases = self.get_default_columns(start_alias=alias,
opts=f.rel.to._meta, as_pairs=True)
- self.query.related_select_cols.extend(columns)
- self.query.related_select_fields.extend(f.rel.to._meta.fields)
+ self.query.related_select_cols.extend(
+ SelectInfo(col, field) for col, field in zip(columns, f.rel.to._meta.fields))
if restricted:
next = requested.get(f.name, {})
else:
@@ -734,8 +734,8 @@ class SQLCompiler(object):
used.add(alias)
columns, aliases = self.get_default_columns(start_alias=alias,
opts=model._meta, as_pairs=True, local_only=True)
- self.query.related_select_cols.extend(columns)
- self.query.related_select_fields.extend(model._meta.fields)
+ self.query.related_select_cols.extend(
+ SelectInfo(col, field) for col, field in zip(columns, model._meta.fields))
next = requested.get(f.related_query_name(), {})
# Use True here because we are looking at the _reverse_ side of
@@ -772,7 +772,7 @@ class SQLCompiler(object):
if resolve_columns:
if fields is None:
# We only set this up here because
- # related_select_fields isn't populated until
+ # related_select_cols isn't populated until
# execute_sql() has been called.
# We also include types of fields of related models that
@@ -782,11 +782,11 @@ class SQLCompiler(object):
# This code duplicates the logic for the order of fields
# found in get_columns(). It would be nice to clean this up.
- if self.query.select_fields:
- fields = self.query.select_fields
+ if self.query.select:
+ fields = [f.field for f in self.query.select]
else:
fields = self.query.model._meta.fields
- fields = fields + self.query.related_select_fields
+ fields = fields + [f.field for f in self.query.related_select_cols]
# If the field was deferred, exclude it from being passed
# into `resolve_columns` because it wasn't selected.