Django

Code

Changeset 7446

Show
Ignore:
Timestamp:
04/23/08 04:53:22 (3 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Fixed the interaction between extra(select=...) and
valuelist(). Fixed #7053.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/query.py

    r7437 r7446  
    558558class ValuesListQuerySet(ValuesQuerySet): 
    559559    def iterator(self): 
    560         self.field_names.extend([f for f in self.query.extra_select.keys()]
     560        self.query.trim_extra_select(self.extra_names
    561561        if self.flat and len(self._fields) == 1: 
    562562            for row in self.query.results_iter(): 
    563563                yield row[0] 
    564         else
     564        elif not self.query.extra_select
    565565            for row in self.query.results_iter(): 
    566566                yield row 
     567        else: 
     568            # When extra(select=...) is involved, the extra cols come are 
     569            # always at the start of the row, so we need to reorder the fields 
     570            # to match the order in self._fields. 
     571            names = self.query.extra_select.keys() + self.field_names 
     572            for row in self.query.results_iter(): 
     573                data = dict(zip(names, row)) 
     574                yield tuple([data[f] for f in self._fields]) 
    567575 
    568576    def _clone(self, *args, **kwargs): 
  • django/branches/queryset-refactor/tests/modeltests/lookup/models.py

    r7343 r7446  
    181181[1, 2, 3, 4, 5, 6, 7] 
    182182 
     183>>> Article.objects.extra(select={'id_plus_one': 'id+1'}).order_by('id').valueslist('id') 
     184[(1,), (2,), (3,), (4,), (5,), (6,), (7,)] 
     185>>> Article.objects.extra(select={'id_plus_one': 'id+1'}).order_by('id').valueslist('id_plus_one', 'id') 
     186[(2, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (8, 7)] 
     187>>> Article.objects.extra(select={'id_plus_one': 'id+1'}).order_by('id').valueslist('id', 'id_plus_one') 
     188[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8)] 
     189 
    183190>>> Article.objects.valueslist('id', 'headline', flat=True) 
    184191Traceback (most recent call last):