diff options
| author | Simon Charette <charette.s@gmail.com> | 2019-03-06 01:05:55 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-03-21 20:36:31 -0400 |
| commit | 35431298226165986ad07e91f9d3aca721ff38ec (patch) | |
| tree | c8de194b6b2b7b6d57de9704eb14cbf74418cdbb /django/db/models/sql/where.py | |
| parent | 96b6ad94d9ebbd57b77b44e185ee215b5b899ac8 (diff) | |
Refs #27149 -- Moved subquery expression resolving to Query.
This makes Subquery a thin wrapper over Query and makes sure it respects
the Expression source expression API by accepting the same number of
expressions as it returns. Refs #30188.
It also makes OuterRef usable in Query without Subquery wrapping. This
should allow Query's internals to more easily perform subquery push downs
during split_exclude(). Refs #21703.
Diffstat (limited to 'django/db/models/sql/where.py')
| -rw-r--r-- | django/db/models/sql/where.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py index 9d3d6a9366..496822c58b 100644 --- a/django/db/models/sql/where.py +++ b/django/db/models/sql/where.py @@ -183,8 +183,23 @@ class WhereNode(tree.Node): def is_summary(self): return any(child.is_summary for child in self.children) + @staticmethod + def _resolve_rhs(rhs, query, *args, **kwargs): + if hasattr(rhs, 'resolve_expression'): + rhs = rhs.resolve_expression(query, *args, **kwargs) + return rhs + + @classmethod + def _resolve_node(cls, node, query, *args, **kwargs): + if hasattr(node, 'children'): + for child in node.children: + cls._resolve_node(child, query, *args, **kwargs) + if hasattr(node, 'rhs'): + node.rhs = cls._resolve_rhs(node.rhs, query, *args, **kwargs) + def resolve_expression(self, *args, **kwargs): clone = self.clone() + clone._resolve_node(clone, *args, **kwargs) clone.resolved = True return clone |
