summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJosh Smeaton <josh.smeaton@gmail.com>2015-03-19 14:07:53 +1100
committerJosh Smeaton <josh.smeaton@gmail.com>2015-03-22 17:36:55 +1100
commit02a2943e4cf95dea0294e8695cfe981f34ae6180 (patch)
treeda87f399010a9c58b013a869af0ba5ba4e14879e /django
parent127b3873d03704f77428b984de022664b268314e (diff)
Fixed #24485 -- Allowed combined expressions to set output_field
Diffstat (limited to 'django')
-rw-r--r--django/db/models/__init__.py4
-rw-r--r--django/db/models/expressions.py29
2 files changed, 29 insertions, 4 deletions
diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py
index fea271f403..4d8ea38898 100644
--- a/django/db/models/__init__.py
+++ b/django/db/models/__init__.py
@@ -2,7 +2,9 @@ from functools import wraps
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured # NOQA
from django.db.models.query import Q, QuerySet, Prefetch # NOQA
-from django.db.models.expressions import Expression, F, Value, Func, Case, When # NOQA
+from django.db.models.expressions import ( # NOQA
+ Expression, ExpressionWrapper, F, Value, Func, Case, When,
+)
from django.db.models.manager import Manager # NOQA
from django.db.models.base import Model # NOQA
from django.db.models.aggregates import * # NOQA
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index c48204f420..c6959f87b8 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -126,12 +126,12 @@ class BaseExpression(object):
# aggregate specific fields
is_summary = False
- def get_db_converters(self, connection):
- return [self.convert_value] + self.output_field.get_db_converters(connection)
-
def __init__(self, output_field=None):
self._output_field = output_field
+ def get_db_converters(self, connection):
+ return [self.convert_value] + self.output_field.get_db_converters(connection)
+
def get_source_expressions(self):
return []
@@ -656,6 +656,29 @@ class Ref(Expression):
return [self]
+class ExpressionWrapper(Expression):
+ """
+ An expression that can wrap another expression so that it can provide
+ extra context to the inner expression, such as the output_field.
+ """
+
+ def __init__(self, expression, output_field):
+ super(ExpressionWrapper, self).__init__(output_field=output_field)
+ self.expression = expression
+
+ def set_source_expressions(self, exprs):
+ self.expression = exprs[0]
+
+ def get_source_expressions(self):
+ return [self.expression]
+
+ def as_sql(self, compiler, connection):
+ return self.expression.as_sql(compiler, connection)
+
+ def __repr__(self):
+ return "{}({})".format(self.__class__.__name__, self.expression)
+
+
class When(Expression):
template = 'WHEN %(condition)s THEN %(result)s'