summaryrefslogtreecommitdiff
path: root/django/db/models/sql/compiler.py
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2013-09-23 18:18:20 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2013-09-25 20:47:57 +0300
commit83554b018ef283827c0e7459ab934d447b3419d5 (patch)
tree78bdc0b8ed3fa12d5d23b5768aec70bf5957b8cb /django/db/models/sql/compiler.py
parent42b9feb2e79546e1d4362c3a4f0043f3c569ace3 (diff)
Fixed #21126 -- QuerySet value conversion failure
A .annotate().select_related() query resulted in misaligned rows vs columns for compiler.resolve_columns() method. Report & patch by Michael Manfre.
Diffstat (limited to 'django/db/models/sql/compiler.py')
-rw-r--r--django/db/models/sql/compiler.py12
1 files changed, 9 insertions, 3 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 4d571b78fa..4a08b1fc14 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -686,6 +686,10 @@ class SQLCompiler(object):
has_aggregate_select = bool(self.query.aggregate_select)
for rows in self.execute_sql(MULTI):
for row in rows:
+ if has_aggregate_select:
+ loaded_fields = self.query.get_loaded_field_names().get(self.query.model, set()) or self.query.select
+ aggregate_start = len(self.query.extra_select) + len(loaded_fields)
+ aggregate_end = aggregate_start + len(self.query.aggregate_select)
if resolve_columns:
if fields is None:
# We only set this up here because
@@ -712,12 +716,14 @@ class SQLCompiler(object):
db_table = self.query.get_meta().db_table
fields = [f for f in fields if db_table in only_load and
f.column in only_load[db_table]]
+ if has_aggregate_select:
+ # pad None in to fields for aggregates
+ fields = fields[:aggregate_start] + [
+ None for x in range(0, aggregate_end - aggregate_start)
+ ] + fields[aggregate_start:]
row = self.resolve_columns(row, fields)
if has_aggregate_select:
- loaded_fields = self.query.get_loaded_field_names().get(self.query.model, set()) or self.query.select
- aggregate_start = len(self.query.extra_select) + len(loaded_fields)
- aggregate_end = aggregate_start + len(self.query.aggregate_select)
row = tuple(row[:aggregate_start]) + tuple(
self.query.resolve_aggregate(value, aggregate, self.connection)
for (alias, aggregate), value