Ticket #9870: aggregation-m2m-opt.diff

File aggregation-m2m-opt.diff, 3.7 KB (added by Alex Gaynor, 16 years ago)

In defiance of all logic and reason I seem to have actually accomplished something within setup_joins :O

  • django/db/models/sql/query.py

    diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
    index ed21ea7..8d69966 100644
    a b class BaseQuery(object):  
    11981198                field_list, opts, self.get_initial_alias(), False)
    11991199            # Aggregate references a model or field that requires a join
    12001200            self.allow_nulls = True
    1201 
    1202             col = (join_list[-1], target.column)
     1201           
     1202            if hasattr(target, 'column'):
     1203                col = (join_list[-1], target.column)
     1204            else:
     1205                col = (join_list[-1], target)
    12031206            aggregate = aggregate_expr.add_to_query(self, aggregates,
    12041207                col=col,
    12051208                source=target,
    class BaseQuery(object):  
    13021305            for alias in extra:
    13031306                self.unref_alias(alias)
    13041307        else:
    1305             col = target.column
     1308            if hasattr(target, 'column'):
     1309                col = target.column
     1310            else:
     1311                col = target
    13061312        alias = join_list[-1]
    13071313
    13081314        while final > 1:
    class BaseQuery(object):  
    15081514            if direct:
    15091515                if m2m:
    15101516                    # Many-to-many field defined on the current model.
    1511                     if cached_data:
     1517                    skip = False
     1518                    if pos+1 == len(names):
     1519                        skip = True
     1520                        table = field.m2m_db_table()
     1521                        from_col = opts.pk.column
     1522                        to_col = field.m2m_column_name()
     1523                        target = field.m2m_reverse_name()
     1524                        int_alias = self.join((alias, table, from_col, to_col), dupe_multis, exclusions, nullable=True, reuse=can_reuse)
     1525                        joins.append(int_alias)
     1526                        alias = int_alias
     1527                    elif cached_data:
    15121528                        (table1, from_col1, to_col1, table2, from_col2,
    15131529                                to_col2, opts, target) = cached_data
    15141530                    else:
    class BaseQuery(object):  
    15231539                        orig_opts._join_cache[name] = (table1, from_col1,
    15241540                                to_col1, table2, from_col2, to_col2, opts,
    15251541                                target)
    1526 
    1527                     int_alias = self.join((alias, table1, from_col1, to_col1),
    1528                             dupe_multis, exclusions, nullable=True,
    1529                             reuse=can_reuse)
    1530                     if int_alias == table2 and from_col2 == to_col2:
    1531                         joins.append(int_alias)
    1532                         alias = int_alias
    1533                     else:
    1534                         alias = self.join(
    1535                                 (int_alias, table2, from_col2, to_col2),
     1542                   
     1543                    if not skip:
     1544                        int_alias = self.join((alias, table1, from_col1, to_col1),
    15361545                                dupe_multis, exclusions, nullable=True,
    15371546                                reuse=can_reuse)
    1538                         joins.extend([int_alias, alias])
     1547                        if int_alias == table2 and from_col2 == to_col2:
     1548                            joins.append(int_alias)
     1549                            alias = int_alias
     1550                        else:
     1551                            alias = self.join(
     1552                                    (int_alias, table2, from_col2, to_col2),
     1553                                    dupe_multis, exclusions, nullable=True,
     1554                                    reuse=can_reuse)
     1555                            joins.extend([int_alias, alias])
    15391556                elif field.rel:
    15401557                    # One-to-one or many-to-one field
    15411558                    if cached_data:
Back to Top