Django

Code

Changeset 7781

Show
Ignore:
Timestamp:
06/29/08 04:39:32 (3 months ago)
Author:
mtredinnick
Message:

Fixed #7246 -- Pull in the all the necessary data when using select_related() with multi-table inheritance.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/sql/query.py

    r7778 r7781  
    443443        return result 
    444444 
    445     def get_default_columns(self, with_aliases=False, col_aliases=None): 
     445    def get_default_columns(self, with_aliases=False, col_aliases=None, 
     446            start_alias=None, opts=None, as_pairs=False): 
    446447        """ 
    447448        Computes the default columns for selecting every field in the base 
     
    449450 
    450451        Returns a list of strings, quoted appropriately for use in SQL 
    451         directly, as well as a set of aliases used in the select statement. 
     452        directly, as well as a set of aliases used in the select statement (if 
     453        'as_pairs' is True, returns a list of (alias, col_name) pairs instead 
     454        of strings as the first component and None as the second component). 
    452455        """ 
    453456        result = [] 
    454         table_alias = self.tables[0] 
    455         root_pk = self.model._meta.pk.column 
     457        if opts is None: 
     458            opts = self.model._meta 
     459        if start_alias: 
     460            table_alias = start_alias 
     461        else: 
     462            table_alias = self.tables[0] 
     463        root_pk = opts.pk.column 
    456464        seen = {None: table_alias} 
    457465        qn = self.quote_name_unless_alias 
    458466        qn2 = self.connection.ops.quote_name 
    459467        aliases = set() 
    460         for field, model in self.model._meta.get_fields_with_model(): 
     468        for field, model in opts.get_fields_with_model(): 
    461469            try: 
    462470                alias = seen[model] 
     
    465473                        root_pk, model._meta.pk.column)) 
    466474                seen[model] = alias 
     475            if as_pairs: 
     476                result.append((alias, field.column)) 
     477                continue 
    467478            if with_aliases and field.column in col_aliases: 
    468479                c_alias = 'Col%d' % len(col_aliases) 
     
    477488                if with_aliases: 
    478489                    col_aliases.add(field.column) 
     490        if as_pairs: 
     491            return result, None 
    479492        return result, aliases 
    480493 
     
    942955                    promote=promote) 
    943956            used.add(alias) 
    944             self.related_select_cols.extend([(alias, f2.column) 
    945                     for f2 in f.rel.to._meta.fields]) 
     957            self.related_select_cols.extend(self.get_default_columns( 
     958                start_alias=alias, opts=f.rel.to._meta, as_pairs=True)[0]) 
    946959            self.related_select_fields.extend(f.rel.to._meta.fields) 
    947960            if restricted: