diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py index 5089737034..8d3648b393 100644 --- a/django/db/models/lookups.py +++ b/django/db/models/lookups.py @@ -406,6 +406,15 @@ class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup): self.rhs.add_fields(['pk']) return super().process_rhs(compiler, connection) + def get_group_by_cols(self, alias=None): + cols = self.lhs.get_group_by_cols() + if hasattr(self.rhs, 'get_group_by_cols'): + if not getattr(self.rhs, 'has_select_fields', True): + self.rhs.clear_select_clause() + self.rhs.add_fields(['pk']) + cols.extend(self.rhs.get_group_by_cols()) + return cols + def get_rhs_op(self, connection, rhs): return 'IN %s' % rhs diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py index 877e7b49a7..5d841b166a 100644 --- a/tests/aggregation_regress/tests.py +++ b/tests/aggregation_regress/tests.py @@ -1525,6 +1525,14 @@ class AggregationTests(TestCase): allow_distinct = True DistinctAggregate('foo', distinct=True) + @skipUnlessDBFeature('supports_subqueries_in_group_by') + def test_having_subquery_select(self): + authors = Author.objects.filter(pk=self.a1.pk) + books = Book.objects.annotate(Count('authors')).filter( + Q(authors__in=authors) | Q(authors__count__gt=2) + ) + self.assertEqual(set(books), {self.b1, self.b4}) + class JoinPromotionTests(TestCase): def test_ticket_21150(self):