Django

Code

Changeset 5396

Show
Ignore:
Timestamp:
05/31/07 19:22:18 (1 year ago)
Author:
bouldersprinters
Message:

boulder-oracle-sprint: Merged [5385]. It got missed earlier.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/boulder-oracle-sprint/django/db/models/query.py

    r5174 r5396  
    567567    def __init__(self, *args, **kwargs): 
    568568        super(ValuesQuerySet, self).__init__(*args, **kwargs) 
    569         # select_related and select aren't supported in values(). 
     569        # select_related isn't supported in values(). 
    570570        self._select_related = False 
    571         self._select = {} 
    572571 
    573572    def iterator(self): 
     
    579578        # self._fields is a list of field names to fetch. 
    580579        if self._fields: 
    581             fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields] 
     580            if not self._select: 
     581                fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields] 
     582            else: 
     583                fields = [] 
     584                for f in self._fields: 
     585                    if f in [field.name for field in self.model._meta.fields]: 
     586                        fields.append(self.model._meta.get_field(f, many_to_many=False)) 
     587                    elif not self._select.has_key( f ): 
     588                        raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f ) 
     589 
     590            field_names = self._fields 
    582591        else: # Default to all fields. 
    583592            fields = self.model._meta.fields 
     593            field_names = [f.attname for f in fields] 
     594 
    584595        columns = [f.column for f in fields] 
    585         field_names = [f.attname for f in fields] 
    586  
    587596        select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 
     597        # Add any additional SELECTs. 
     598        if self._select: 
     599            select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()]) 
     600 
    588601        cursor = connection.cursor() 
    589602        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) 
  • django/branches/boulder-oracle-sprint/tests/modeltests/lookup/models.py

    r5157 r5396  
    132132[('headline', 'Article 1'), ('id', 1)] 
    133133 
     134 
     135# you can use values() even on extra fields 
     136>>> for d in Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_one'): 
     137...     i = d.items() 
     138...     i.sort() 
     139...     i 
     140[('id', 5), ('id_plus_one', 6)] 
     141[('id', 6), ('id_plus_one', 7)] 
     142[('id', 4), ('id_plus_one', 5)] 
     143[('id', 2), ('id_plus_one', 3)] 
     144[('id', 3), ('id_plus_one', 4)] 
     145[('id', 7), ('id_plus_one', 8)] 
     146[('id', 1), ('id_plus_one', 2)] 
     147 
     148# however, an exception FieldDoesNotExist will still be thrown  
     149# if you try to access non-existent field (field that is neither on the model nor extra) 
     150>>> Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_two') 
     151Traceback (most recent call last): 
     152    ... 
     153FieldDoesNotExist: Article has no field named 'id_plus_two' 
     154 
    134155# if you don't specify which fields, all are returned 
    135156>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]