Changeset 5396
- Timestamp:
- 05/31/07 19:22:18 (1 year ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/boulder-oracle-sprint/django/db/models/query.py
r5174 r5396 567 567 def __init__(self, *args, **kwargs): 568 568 super(ValuesQuerySet, self).__init__(*args, **kwargs) 569 # select_related and select aren't supported in values().569 # select_related isn't supported in values(). 570 570 self._select_related = False 571 self._select = {}572 571 573 572 def iterator(self): … … 579 578 # self._fields is a list of field names to fetch. 580 579 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 582 591 else: # Default to all fields. 583 592 fields = self.model._meta.fields 593 field_names = [f.attname for f in fields] 594 584 595 columns = [f.column for f in fields] 585 field_names = [f.attname for f in fields]586 587 596 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 588 601 cursor = connection.cursor() 589 602 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) django/branches/boulder-oracle-sprint/tests/modeltests/lookup/models.py
r5157 r5396 132 132 [('headline', 'Article 1'), ('id', 1)] 133 133 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') 151 Traceback (most recent call last): 152 ... 153 FieldDoesNotExist: Article has no field named 'id_plus_two' 154 134 155 # if you don't specify which fields, all are returned 135 156 >>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
