diff options
| author | Josh Smeaton <josh.smeaton@gmail.com> | 2015-03-19 14:07:53 +1100 |
|---|---|---|
| committer | Josh Smeaton <josh.smeaton@gmail.com> | 2015-03-22 17:36:55 +1100 |
| commit | 02a2943e4cf95dea0294e8695cfe981f34ae6180 (patch) | |
| tree | da87f399010a9c58b013a869af0ba5ba4e14879e /django | |
| parent | 127b3873d03704f77428b984de022664b268314e (diff) | |
Fixed #24485 -- Allowed combined expressions to set output_field
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/__init__.py | 4 | ||||
| -rw-r--r-- | django/db/models/expressions.py | 29 |
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' |
