From c412926a2e359afb40738d8177c9f3bef80ee04e Mon Sep 17 00:00:00 2001 From: Matthew Schinckel Date: Fri, 23 Feb 2018 18:01:01 +1030 Subject: [PATCH] Fixed #29142 -- Fixed crash when OuterRef is used with an operator. --- django/db/models/expressions.py | 3 +++ tests/expressions/tests.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index b2a90c1a3f..8c67839616 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -525,6 +525,9 @@ class ResolvedOuterRef(F): def _prepare(self, output_field=None): return self + def relabeled_clone(self, relabels): + return self + class OuterRef(F): def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False): diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 561a8e3563..0286a956e6 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -575,6 +575,11 @@ class BasicExpressionsTests(TestCase): outer = Result.objects.filter(pk__in=Subquery(inner.values('pk'))) self.assertFalse(outer.exists()) + def test_outerref_with_operator(self): + inner = Company.objects.filter(num_employees=OuterRef('ceo__salary') + 2) + outer = Company.objects.filter(pk__in=Subquery(inner.values('pk'))) + self.assertEqual(outer.get().name, 'Test GmbH') + class IterableLookupInnerExpressionsTests(TestCase): @classmethod