          obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
          obj.distinct = self.distinct
          obj.select_related = self.select_related
          obj.related_select_cols = []
          obj.aggregate_select = self.aggregate_select.copy()
          obj.max_depth = self.max_depth
          obj.extra_select = self.extra_select.copy()
          obj.extra_tables = self.extra_tables
          obj.extra_where = self.extra_where
          obj.extra_params = self.extra_params
 
</s> remove         self.aggregate_select = SortedDict() # Maps alias -> SQL aggregate function
 </s> add         self.aggregates = SortedDict() # Maps alias -> SQL aggregate function
        self.aggregate_select_mask = None
        self._aggregate_select_cache = None </s> remove             aggregate.lookup in self.aggregate_select.keys()):
 </s> add             aggregate.lookup in self.aggregates.keys()): </s> remove         query.aggregate_select[alias] = aggregate
 </s> add         query.aggregates[alias] = aggregate </s> remove         for pos, col in enumerate(self.select):
            if isinstance(col, (list, tuple)):
                old_alias = col[0]
                self.select[pos] = (change_map.get(old_alias, old_alias), col[1])
            else:
                col.relabel_aliases(change_map)
 </s> add         self.having.relabel_aliases(change_map)
        for columns in (self.select, self.aggregates.values(), self.group_by or []):
            for pos, col in enumerate(columns):
                if isinstance(col, (list, tuple)):
                    old_alias = col[0]
                    columns[pos] = (change_map.get(old_alias, old_alias), col[1])
                else:
                    col.relabel_aliases(change_map)
        obj.aggregates = self.aggregates.copy()
        if self.aggregate_select_mask is None:
            obj.aggregate_select_mask = None
        else:
            obj.aggregate_select_mask = self.aggregate_select_mask[:]
        if self._aggregate_select_cache is None:
            obj._aggregate_select_cache = None
        else:
            obj._aggregate_select_cache = self._aggregate_select_cache.copy()
          obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
          obj.distinct = self.distinct
          obj.select_related = self.select_related
          obj.related_select_cols = []
        obj.aggregates = self.aggregates.copy()
        if self.aggregate_select_mask is None:
            obj.aggregate_select_mask = None
        else:
            obj.aggregate_select_mask = self.aggregate_select_mask[:]
        if self._aggregate_select_cache is None:
            obj._aggregate_select_cache = None
        else:
            obj._aggregate_select_cache = self._aggregate_select_cache.copy()
          obj.max_depth = self.max_depth
          obj.extra_select = self.extra_select.copy()
          obj.extra_tables = self.extra_tables
          obj.extra_where = self.extra_where
          obj.extra_params = self.extra_params
keep keep keep keep replace keep keep keep keep keep
 Fixed #10182 -- Corrected realiasing and the process of evaluating values() for queries with aggregate clauses. This means that aggregate queries can now be used as subqueries (such as in an __in clause). Thanks to omat for the report.

This involves a slight change to the interaction of annotate() and values() clauses that specify a list of columns. See the docs for details.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9888 bcc190cf-cafb-0310-a4f2-bffc1f526a37 
django/db/models/sql/query.py