Django

Code

Changeset 5768

Show
Ignore:
Timestamp:
07/27/07 17:07:42 (1 year ago)
Author:
adrian
Message:

Fixed bug with using values() and extra(select) in the same QuerySet?, with a select dictionary containing more than a few elements. This bug was identified in unit test from [5767]. The problem was that we were relying on the dictionary's .items() ordering, which is undefined

Files:

Legend:

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

    r5609 r5768  
    580580            raise StopIteration 
    581581 
    582         # self._fields is a list of field names to fetch. 
     582        # self._select is a dictionary, and dictionaries' key order is 
     583        # undefined, so we convert it to a list of tuples. 
     584        extra_select = self._select.items() 
     585 
     586        # Construct two objects -- fields and field_names. 
     587        # fields is a list of Field objects to fetch. 
     588        # field_names is a list of field names, which will be the keys in the 
     589        # resulting dictionaries. 
    583590        if self._fields: 
    584             if not self._select: 
     591            if not extra_select: 
    585592                fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields] 
     593                field_names = self._fields 
    586594            else: 
    587595                fields = [] 
     596                field_names = [] 
    588597                for f in self._fields: 
    589598                    if f in [field.name for field in self.model._meta.fields]: 
    590599                        fields.append(self.model._meta.get_field(f, many_to_many=False)) 
    591                     elif not self._select.has_key( f ): 
    592                         raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f ) 
    593  
    594             field_names = self._fields 
     600                        field_names.append(f) 
     601                    elif not self._select.has_key(f): 
     602                        raise FieldDoesNotExist('%s has no field named %r' % (self.model._meta.object_name, f)) 
    595603        else: # Default to all fields. 
    596604            fields = self.model._meta.fields 
     
    599607        columns = [f.column for f in fields] 
    600608        select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 
    601         # Add any additional SELECTs. 
    602         if self._select: 
    603             select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()]) 
     609        if extra_select: 
     610            select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in extra_select]) 
     611            field_names.extend([f[0] for f in extra_select]) 
    604612 
    605613        cursor = connection.cursor()