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:31:01 +0100
commit771c250b106f8f4beda42c104c60498ed568b5e2 (patch)
tree2bdbaaa67c3a1e5b15d48f158a15cfcb527acfed
parentdc1c9b4ddd3ca64279da7c97b5023fbedf2340e2 (diff)
[5.2.x] Fixed #36181 -- Allowed Subquery usage in __in lookups against composite pks.
Thanks Jacob Walls for the report. Backport of 8561100425876bde3be4b2a22324655f74ff9609 from main.
-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 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):