From c5bdfab9ae17953645812dc1ffc7f0b50354b7c5 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Thu, 8 Jan 2009 05:49:03 +0000 Subject: [PATCH] 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 --- django/db/models/query.py | 6 +++++- django/db/models/sql/query.py | 9 +++++++++ tests/regressiontests/queries/models.py | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/django/db/models/query.py b/django/db/models/query.py index 563b902bb5..e2dcb1fa65 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -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,7 +705,10 @@ class ValuesQuerySet(QuerySet): Cloning a ValuesQuerySet preserves the current fields. """ c = super(ValuesQuerySet, self)._clone(klass, **kwargs) - c._fields = self._fields[:] + 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 if setup and hasattr(c, '_setup_query'): diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 876099cb1f..b12912461f 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -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 diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index 05842ebe7b..b32a0c5a63 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -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')) +[] + """} # In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__