diff options
| author | Ian Foote <python@ian.feete.org> | 2016-08-15 11:35:12 +1000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-08-18 16:05:15 -0400 |
| commit | 39f35d4b9de223b72c67bb1d12e65669b4e1355b (patch) | |
| tree | 945d6d64af708824d2b9f0fc552127b0c8d4f866 /django/db | |
| parent | d4eefc7e2af0d93283ed1c03e0af0a482982b6f0 (diff) | |
Fixed #25871 -- Added expressions support to QuerySet.values().
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/models/query.py | 21 |
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 |
