summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/expressions.py7
-rw-r--r--tests/expressions/tests.py9
2 files changed, 15 insertions, 1 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 8361e42d20..ed57599a15 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -940,10 +940,15 @@ class Subquery(Expression):
def resolve(child):
if hasattr(child, 'resolve_expression'):
- return child.resolve_expression(
+ resolved = child.resolve_expression(
query=query, allow_joins=allow_joins, reuse=reuse,
summarize=summarize, for_save=for_save,
)
+ # Add table alias to the parent query's aliases to prevent
+ # quoting.
+ if hasattr(resolved, 'alias'):
+ clone.queryset.query.external_aliases.add(resolved.alias)
+ return resolved
return child
resolve_all(clone.queryset.query.where)
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index 38258e0dd0..5483a17fd1 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -516,6 +516,15 @@ class BasicExpressionsTests(TestCase):
[{'salary': 10, 'total_employees': 2300}, {'salary': 20, 'total_employees': 35}],
)
+ def test_subquery_references_joined_table_twice(self):
+ inner = Company.objects.filter(
+ num_chairs__gte=OuterRef('ceo__salary'),
+ num_employees__gte=OuterRef('point_of_contact__salary'),
+ )
+ # Another contrived example (there is no need to have a subquery here)
+ outer = Company.objects.filter(pk__in=Subquery(inner.values('pk')))
+ self.assertFalse(outer.exists())
+
class IterableLookupInnerExpressionsTests(TestCase):
@classmethod