mirror of
https://github.com/django/django.git
synced 2025-09-23 10:42:45 +00:00
Fixed #25871 -- Added expressions support to QuerySet.values().
This commit is contained in:
parent
d4eefc7e2a
commit
39f35d4b9d
4 changed files with 115 additions and 7 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue