summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2025-02-09 21:42:06 -0500
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-02-13 09:29:24 +0100
commit8561100425876bde3be4b2a22324655f74ff9609 (patch)
treebcdced631d2bee3948543d4e9344fad7a1d6c223
parent47c837a1ff96ef1b10b44477a7a9f72283d12e83 (diff)
Fixed #36181 -- Allowed Subquery usage in __in lookups against composite pks.
Thanks Jacob Walls for the report.
-rw-r--r--django/db/models/fields/tuple_lookups.py10
-rw-r--r--tests/composite_pk/test_filter.py5
2 files changed, 13 insertions, 2 deletions
diff --git a/django/db/models/fields/tuple_lookups.py b/django/db/models/fields/tuple_lookups.py
index f62a49bd60..e3cb696249 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,
@@ -301,7 +307,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):