summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2016-08-15 11:35:12 +1000
committerTim Graham <timograham@gmail.com>2016-08-18 16:05:15 -0400
commit39f35d4b9de223b72c67bb1d12e65669b4e1355b (patch)
tree945d6d64af708824d2b9f0fc552127b0c8d4f866 /django/db
parentd4eefc7e2af0d93283ed1c03e0af0a482982b6f0 (diff)
Fixed #25871 -- Added expressions support to QuerySet.values().
Diffstat (limited to 'django/db')
-rw-r--r--django/db/models/query.py21
1 files changed, 17 insertions, 4 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 1fe2f45870..7a2ef08ba2 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -678,14 +678,17 @@ class QuerySet(object):
using = self.db
return RawQuerySet(raw_query, model=self.model, params=params, translations=translations, using=using)
- def _values(self, *fields):
+ def _values(self, *fields, **expressions):
clone = self._clone()
+ if expressions:
+ clone = clone.annotate(**expressions)
clone._fields = fields
clone.query.set_values(fields)
return clone
- def values(self, *fields):
- clone = self._values(*fields)
+ def values(self, *fields, **expressions):
+ fields += tuple(expressions)
+ clone = self._values(*fields, **expressions)
clone._iterable_class = ValuesIterable
return clone
@@ -697,7 +700,17 @@ class QuerySet(object):
if flat and len(fields) > 1:
raise TypeError("'flat' is not valid when values_list is called with more than one field.")
- clone = self._values(*fields)
+ _fields = []
+ expressions = {}
+ for field in fields:
+ if hasattr(field, 'resolve_expression'):
+ field_id = str(id(field))
+ expressions[field_id] = field
+ _fields.append(field_id)
+ else:
+ _fields.append(field)
+
+ clone = self._values(*_fields, **expressions)
clone._iterable_class = FlatValuesListIterable if flat else ValuesListIterable
return clone