summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2019-03-27 08:24:05 +0100
committerGitHub <noreply@github.com>2019-03-27 08:24:05 +0100
commit2a431db0f5e91110b4fda05949de1f158a20ec5b (patch)
tree5acda0220006047a6b83af583e5d42bca633afc0
parentc4447ad231b6ba071a5295192faa41ff6494f14e (diff)
Fixed #28621 -- Fixed crash of annotations with OuterRef.
-rw-r--r--django/db/models/expressions.py2
-rw-r--r--tests/expressions/tests.py11
2 files changed, 13 insertions, 0 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 37818850be..16df317631 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -527,6 +527,8 @@ class ResolvedOuterRef(F):
In this case, the reference to the outer query has been resolved because
the inner query has been used as a subquery.
"""
+ contains_aggregate = False
+
def as_sql(self, *args, **kwargs):
raise ValueError(
'This queryset contains a reference to an outer query and may '
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index c19178b3ca..c20b88ff83 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -591,6 +591,17 @@ class BasicExpressionsTests(TestCase):
outer = Company.objects.filter(pk__in=Subquery(inner.values('pk')))
self.assertEqual(outer.get().name, 'Test GmbH')
+ def test_annotation_with_outerref(self):
+ gmbh_salary = Company.objects.annotate(
+ max_ceo_salary_raise=Subquery(
+ Company.objects.annotate(
+ salary_raise=OuterRef('num_employees') + F('num_employees'),
+ ).order_by('-salary_raise').values('salary_raise')[:1],
+ output_field=models.IntegerField(),
+ ),
+ ).get(pk=self.gmbh.pk)
+ self.assertEqual(gmbh_salary.max_ceo_salary_raise, 2332)
+
def test_pickle_expression(self):
expr = Value(1, output_field=models.IntegerField())
expr.convert_value # populate cached property