1
0
mirror of https://github.com/django/django.git synced 2024-12-23 01:25:58 +00:00

Fixed #28621 -- Fixed crash of annotations with OuterRef.

This commit is contained in:
Mariusz Felisiak 2019-03-27 08:24:05 +01:00 committed by GitHub
parent c4447ad231
commit 2a431db0f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 0 deletions

View File

@ -527,6 +527,8 @@ class ResolvedOuterRef(F):
In this case, the reference to the outer query has been resolved because In this case, the reference to the outer query has been resolved because
the inner query has been used as a subquery. the inner query has been used as a subquery.
""" """
contains_aggregate = False
def as_sql(self, *args, **kwargs): def as_sql(self, *args, **kwargs):
raise ValueError( raise ValueError(
'This queryset contains a reference to an outer query and may ' 'This queryset contains a reference to an outer query and may '

View File

@ -591,6 +591,17 @@ class BasicExpressionsTests(TestCase):
outer = Company.objects.filter(pk__in=Subquery(inner.values('pk'))) outer = Company.objects.filter(pk__in=Subquery(inner.values('pk')))
self.assertEqual(outer.get().name, 'Test GmbH') 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): def test_pickle_expression(self):
expr = Value(1, output_field=models.IntegerField()) expr = Value(1, output_field=models.IntegerField())
expr.convert_value # populate cached property expr.convert_value # populate cached property