diff options
| author | Simon Charette <charette.s@gmail.com> | 2025-02-09 21:42:06 -0500 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-02-13 09:29:24 +0100 |
| commit | 8561100425876bde3be4b2a22324655f74ff9609 (patch) | |
| tree | bcdced631d2bee3948543d4e9344fad7a1d6c223 | |
| parent | 47c837a1ff96ef1b10b44477a7a9f72283d12e83 (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.py | 10 | ||||
| -rw-r--r-- | tests/composite_pk/test_filter.py | 5 |
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): |
