diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-16 12:29:31 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-16 12:29:31 +0000 |
| commit | fb64ea78968714929a75514ecd55fb5af1093697 (patch) | |
| tree | 2b98a4447d342c8d138eb17a7f9a419e8ce5ef83 /django/db/models/sql | |
| parent | 58ea6d45618cb8b5bd4306c395d7bb8860f9a842 (diff) | |
Fixed #10132 -- Corrected the interaction of extra() queries with the values() clause. Thanks to Glen Maynard for the report.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9838 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/sql')
| -rw-r--r-- | django/db/models/sql/query.py | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index bf664c606e..f868347960 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -68,7 +68,7 @@ class BaseQuery(object): self.tables = [] # Aliases in the order they are created. self.where = where() self.where_class = where - self.group_by = [] + self.group_by = None self.having = where() self.order_by = [] self.low_mark, self.high_mark = 0, None # Used for offset/limit @@ -177,7 +177,10 @@ class BaseQuery(object): obj.tables = self.tables[:] obj.where = deepcopy(self.where) obj.where_class = self.where_class - obj.group_by = self.group_by[:] + if self.group_by is None: + obj.group_by = None + else: + obj.group_by = self.group_by[:] obj.having = deepcopy(self.having) obj.order_by = self.order_by[:] obj.low_mark, obj.high_mark = self.low_mark, self.high_mark @@ -272,7 +275,7 @@ class BaseQuery(object): # If there is a group by clause, aggregating does not add useful # information but retrieves only the first row. Aggregate # over the subquery instead. - if self.group_by: + if self.group_by is not None: from subqueries import AggregateQuery query = AggregateQuery(self.model, self.connection) @@ -379,8 +382,8 @@ class BaseQuery(object): result.append('AND') result.append(' AND '.join(self.extra_where)) - if self.group_by: - grouping = self.get_grouping() + grouping = self.get_grouping() + if grouping: if ordering: # If the backend can't group by PK (i.e., any database # other than MySQL), then any fields mentioned in the @@ -698,13 +701,15 @@ class BaseQuery(object): """ qn = self.quote_name_unless_alias result = [] - for col in self.group_by + self.related_select_cols: - if isinstance(col, (list, tuple)): - result.append('%s.%s' % (qn(col[0]), qn(col[1]))) - elif hasattr(col, 'as_sql'): - result.append(col.as_sql(qn)) - else: - result.append(str(col)) + if self.group_by is not None: + group_by = self.group_by or [] + for col in group_by + self.related_select_cols + self.extra_select.keys(): + if isinstance(col, (list, tuple)): + result.append('%s.%s' % (qn(col[0]), qn(col[1]))) + elif hasattr(col, 'as_sql'): + result.append(col.as_sql(qn)) + else: + result.append(str(col)) return result def get_ordering(self): @@ -1224,7 +1229,7 @@ class BaseQuery(object): # Aggregate references a normal field field_name = field_list[0] source = opts.get_field(field_name) - if not (self.group_by and is_summary): + if not (self.group_by is not None and is_summary): # Only use a column alias if this is a # standalone aggregate, or an annotation col = (opts.db_table, source.column) @@ -1816,6 +1821,7 @@ class BaseQuery(object): primary key, and the query would be equivalent, the optimization will be made automatically. """ + self.group_by = [] if self.connection.features.allows_group_by_pk: if len(self.select) == len(self.model._meta.fields): self.group_by.append('.'.join([self.model._meta.db_table, |
