Commit c5bdfab9 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #9985 -- qs.values_list(...).values(...) was constructing incorrect SQL.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9717 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent d068ad0c
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -680,6 +680,7 @@ class ValuesQuerySet(QuerySet):
        Called by the _clone() method after initializing the rest of the
        instance.
        """
        self.query.clear_select_fields()
        self.extra_names = []
        if self._fields:
            if not self.query.extra_select:
@@ -704,6 +705,9 @@ class ValuesQuerySet(QuerySet):
        Cloning a ValuesQuerySet preserves the current fields.
        """
        c = super(ValuesQuerySet, self)._clone(klass, **kwargs)
        if not hasattr(c, '_fields'):
            # Only clone self._fields if _fields wasn't passed into the cloning
            # call directly.
            c._fields = self._fields[:]
        c.field_names = self.field_names
        c.extra_names = self.extra_names
+9 −0
Original line number Diff line number Diff line
@@ -1538,6 +1538,15 @@ class BaseQuery(object):
        """
        return not (self.low_mark or self.high_mark)

    def clear_select_fields(self):
        """
        Clears the list of fields to select (but not extra_select columns).
        Some queryset types completely replace any existing list of select
        columns.
        """
        self.select = []
        self.select_fields = []

    def add_fields(self, field_names, allow_m2m=True):
        """
        Adds the given (model) fields to the select set. The field names are
+6 −0
Original line number Diff line number Diff line
@@ -1022,6 +1022,12 @@ nothing).
>>> print Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query
SELECT ...

Bug #9985 -- qs.values_list(...).values(...) combinations should work.
>>> Note.objects.values_list("note", flat=True).values("id").order_by("id")
[{'id': 1}, {'id': 2}, {'id': 3}]
>>> Annotation.objects.filter(notes__in=Note.objects.filter(note="n1").values_list('note').values('id'))
[<Annotation: a1>]

"""}

# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__