summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2016-08-15 15:49:33 +1000
committerMarkus Holtermann <info@markusholtermann.eu>2016-08-16 10:03:40 +1000
commit698be78d7438aade49d3cac5ea1f9de219d33e42 (patch)
tree4f6625f16e220bc535b774d62480ad41c2f23c5f
parent7549eb000430192833f05186056d1ae20b0d17ad (diff)
Fixed #24854 -- Refactored QuerySet._values
Added django.db.models.sql.query.Query.set_values() method to handle query mutation.
-rw-r--r--django/db/models/query.py37
-rw-r--r--django/db/models/sql/query.py35
2 files changed, 36 insertions, 36 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 0a0965fe47..1fe2f45870 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -681,42 +681,7 @@ class QuerySet(object):
def _values(self, *fields):
clone = self._clone()
clone._fields = fields
-
- query = clone.query
- query.select_related = False
- query.clear_deferred_loading()
- query.clear_select_fields()
-
- if query.group_by is True:
- query.add_fields((f.attname for f in self.model._meta.concrete_fields), False)
- query.set_group_by()
- query.clear_select_fields()
-
- if fields:
- field_names = []
- extra_names = []
- annotation_names = []
- if not query._extra and not query._annotations:
- # Shortcut - if there are no extra or annotations, then
- # the values() clause must be just field names.
- field_names = list(fields)
- else:
- query.default_cols = False
- for f in fields:
- if f in query.extra_select:
- extra_names.append(f)
- elif f in query.annotation_select:
- annotation_names.append(f)
- else:
- field_names.append(f)
- query.set_extra_mask(extra_names)
- query.set_annotation_mask(annotation_names)
- else:
- field_names = [f.attname for f in self.model._meta.concrete_fields]
-
- query.values_select = field_names
- query.add_fields(field_names, True)
-
+ clone.query.set_values(fields)
return clone
def values(self, *fields):
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 426087f8af..d94a3abda5 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1847,6 +1847,41 @@ class Query(object):
self.extra_select_mask = set(names)
self._extra_select_cache = None
+ def set_values(self, fields):
+ self.select_related = False
+ self.clear_deferred_loading()
+ self.clear_select_fields()
+
+ if self.group_by is True:
+ self.add_fields((f.attname for f in self.model._meta.concrete_fields), False)
+ self.set_group_by()
+ self.clear_select_fields()
+
+ if fields:
+ field_names = []
+ extra_names = []
+ annotation_names = []
+ if not self._extra and not self._annotations:
+ # Shortcut - if there are no extra or annotations, then
+ # the values() clause must be just field names.
+ field_names = list(fields)
+ else:
+ self.default_cols = False
+ for f in fields:
+ if f in self.extra_select:
+ extra_names.append(f)
+ elif f in self.annotation_select:
+ annotation_names.append(f)
+ else:
+ field_names.append(f)
+ self.set_extra_mask(extra_names)
+ self.set_annotation_mask(annotation_names)
+ else:
+ field_names = [f.attname for f in self.model._meta.concrete_fields]
+
+ self.values_select = field_names
+ self.add_fields(field_names, True)
+
@property
def annotation_select(self):
"""The OrderedDict of aggregate columns that are not masked, and should