diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2013-09-23 18:18:20 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-09-25 20:50:48 +0300 |
| commit | d7ae0bc372f8423e7bcf9b5408df46fd5c8dc27d (patch) | |
| tree | 410abca809582026c7dd85e45aac76577c768fbd /django/db/models | |
| parent | 5207928151938114cea3ca2d56990e10bf3e8544 (diff) | |
[1.6.x] 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.
Backpatch of 83554b018ef283827c0e7459ab934d447b3419d5 from master.
Diffstat (limited to 'django/db/models')
| -rw-r--r-- | django/db/models/sql/compiler.py | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index e768cedf88..8ec624b2e6 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -709,6 +709,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 @@ -735,12 +739,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 |
