|
@@ -167,13 +167,16 @@ class Combinable:
|
|
|
return NegatedExpression(self)
|
|
|
|
|
|
|
|
|
+class OutputFieldIsNoneError(FieldError):
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
class BaseExpression:
|
|
|
"""Base class for all query expressions."""
|
|
|
|
|
|
empty_result_set_value = NotImplemented
|
|
|
|
|
|
is_summary = False
|
|
|
- _output_field_resolved_to_none = False
|
|
|
|
|
|
filterable = True
|
|
|
|
|
@@ -323,11 +326,12 @@ class BaseExpression:
|
|
|
"""Return the output type of this expressions."""
|
|
|
output_field = self._resolve_output_field()
|
|
|
if output_field is None:
|
|
|
- self._output_field_resolved_to_none = True
|
|
|
- raise FieldError("Cannot resolve expression type, unknown output_field")
|
|
|
+ raise OutputFieldIsNoneError(
|
|
|
+ "Cannot resolve expression type, unknown output_field"
|
|
|
+ )
|
|
|
return output_field
|
|
|
|
|
|
- @cached_property
|
|
|
+ @property
|
|
|
def _output_field_or_none(self):
|
|
|
"""
|
|
|
Return the output field of this expression, or None if
|
|
@@ -335,9 +339,8 @@ class BaseExpression:
|
|
|
"""
|
|
|
try:
|
|
|
return self.output_field
|
|
|
- except FieldError:
|
|
|
- if not self._output_field_resolved_to_none:
|
|
|
- raise
|
|
|
+ except OutputFieldIsNoneError:
|
|
|
+ return
|
|
|
|
|
|
def _resolve_output_field(self):
|
|
|
"""
|