summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/expressions.py9
-rw-r--r--django/db/models/sql/query.py2
2 files changed, 7 insertions, 4 deletions
diff --git a/django/db/models/sql/expressions.py b/django/db/models/sql/expressions.py
index 374509914d..c809e25b49 100644
--- a/django/db/models/sql/expressions.py
+++ b/django/db/models/sql/expressions.py
@@ -1,14 +1,16 @@
from django.core.exceptions import FieldError
from django.db.models.constants import LOOKUP_SEP
from django.db.models.fields import FieldDoesNotExist
+from django.db.models.sql.constants import REUSE_ALL
class SQLEvaluator(object):
- def __init__(self, expression, query, allow_joins=True):
+ def __init__(self, expression, query, allow_joins=True, reuse=REUSE_ALL):
self.expression = expression
self.opts = query.get_meta()
self.cols = []
self.contains_aggregate = False
+ self.reuse = reuse
self.expression.prepare(self, query, allow_joins)
def prepare(self):
@@ -50,9 +52,10 @@ class SQLEvaluator(object):
try:
field, source, opts, join_list, last, _ = query.setup_joins(
field_list, query.get_meta(),
- query.get_initial_alias(), False)
+ query.get_initial_alias(), self.reuse)
col, _, join_list = query.trim_joins(source, join_list, last, False)
-
+ if self.reuse is not None and self.reuse != REUSE_ALL:
+ self.reuse.update(join_list)
self.cols.append((node, (join_list[-1], col)))
except FieldDoesNotExist:
raise FieldError("Cannot resolve keyword %r into field. "
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 4cfb816958..b03465b402 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1096,7 +1096,7 @@ class Query(object):
value = value()
elif isinstance(value, ExpressionNode):
# If value is a query expression, evaluate it
- value = SQLEvaluator(value, self)
+ value = SQLEvaluator(value, self, reuse=can_reuse)
having_clause = value.contains_aggregate
for alias, aggregate in self.aggregates.items():