diff options
| author | Nasir Hussain <nasirhjafri@gmail.com> | 2019-01-15 01:52:09 +0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-01-15 07:22:59 -0500 |
| commit | f021c110d02fd7ca32ae56f511b46e5d138b6c73 (patch) | |
| tree | d97f6cc8cfab98191fbe63752edb93a583720b5c | |
| parent | 87bf35abd3df1015d0c08a9251739d6c8454ab32 (diff) | |
Fixed #30099 -- Fixed invalid SQL when filtering a Subquery by an aggregate.
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/expressions.py | 1 | ||||
| -rw-r--r-- | tests/expressions/tests.py | 12 |
3 files changed, 14 insertions, 0 deletions
@@ -618,6 +618,7 @@ answer newbie questions, and generally made Django that much better: Mykola Zamkovoi <nickzam@gmail.com> Nagy Károly <charlie@rendszergazda.com> Nasimul Haque <nasim.haque@gmail.com> + Nasir Hussain <nasirhjafri@gmail.com> Natalia Bidart <nataliabidart@gmail.com> Nate Bragg <jonathan.bragg@alum.rpi.edu> Neal Norwitz <nnorwitz@google.com> diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index d433d6b8a0..ccb9636503 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -994,6 +994,7 @@ class Subquery(Expression): query which will be resolved when it is applied to that query. """ template = '(%(subquery)s)' + contains_aggregate = False def __init__(self, queryset, output_field=None, **extra): self.queryset = queryset diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index ee3676e64a..df92dba432 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -534,6 +534,18 @@ class BasicExpressionsTests(TestCase): outer = Company.objects.filter(pk__in=Subquery(inner.values('pk'))) self.assertFalse(outer.exists()) + def test_subquery_filter_by_aggregate(self): + Number.objects.create(integer=1000, float=1.2) + Employee.objects.create(salary=1000) + qs = Number.objects.annotate( + min_valuable_count=Subquery( + Employee.objects.filter( + salary=OuterRef('integer'), + ).annotate(cnt=Count('salary')).filter(cnt__gt=0).values('cnt')[:1] + ), + ) + self.assertEqual(qs.get().float, 1.2) + def test_explicit_output_field(self): class FuncA(Func): output_field = models.CharField() |
