diff --git a/django/db/models/fields/tuple_lookups.py b/django/db/models/fields/tuple_lookups.py index 161e2973a0..6c21263b6a 100644 --- a/django/db/models/fields/tuple_lookups.py +++ b/django/db/models/fields/tuple_lookups.py @@ -2,7 +2,13 @@ import itertools from django.core.exceptions import EmptyResultSet from django.db.models import Field -from django.db.models.expressions import ColPairs, Func, ResolvedOuterRef, Value +from django.db.models.expressions import ( + ColPairs, + Func, + ResolvedOuterRef, + Subquery, + Value, +) from django.db.models.lookups import ( Exact, GreaterThan, @@ -290,7 +296,7 @@ class TupleIn(TupleLookupMixin, In): ) def check_rhs_is_query(self): - if not isinstance(self.rhs, Query): + if not isinstance(self.rhs, (Query, Subquery)): lhs_str = self.get_lhs_str() rhs_cls = self.rhs.__class__.__name__ raise ValueError( diff --git a/tests/composite_pk/test_filter.py b/tests/composite_pk/test_filter.py index d4c6ef13e0..c633348cc1 100644 --- a/tests/composite_pk/test_filter.py +++ b/tests/composite_pk/test_filter.py @@ -442,6 +442,11 @@ class CompositePKFilterTests(TestCase): with self.assertRaisesMessage(ValueError, msg): Comment.objects.filter(text__gt=Cast(F("pk"), TextField())).count() + def test_explicit_subquery(self): + subquery = Subquery(User.objects.values("pk")) + self.assertEqual(User.objects.filter(pk__in=subquery).count(), 4) + self.assertEqual(Comment.objects.filter(user__in=subquery).count(), 5) + def test_filter_case_when(self): msg = "When expression does not support composite primary keys." with self.assertRaisesMessage(ValueError, msg):