summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-01-08 05:49:03 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-01-08 05:49:03 +0000
commitc5bdfab9ae17953645812dc1ffc7f0b50354b7c5 (patch)
tree2b93b396230c44b539de4f562e876a4df519a294
parentd068ad0c01be9bb085c86a4e0c4dd047a85ce18d (diff)
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
-rw-r--r--django/db/models/query.py6
-rw-r--r--django/db/models/sql/query.py9
-rw-r--r--tests/regressiontests/queries/models.py6
3 files changed, 20 insertions, 1 deletions
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'))
+[<Annotation: a1>]
+
"""}
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__