diff options
| author | 사재혁 <wogur981208@gmail.com> | 2025-09-20 02:15:41 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-19 13:15:41 -0400 |
| commit | 23b659402663dace32a04a0bf15dd13e5bfadc7e (patch) | |
| tree | 571686141d636d36f56b37a0504f1466b3c5ca82 | |
| parent | 7528979153355faa49c3e49ba3ea233f998a7583 (diff) | |
Fixed #36584, Refs #36149 -- Allowed subquery values against tuple in lookup via ForeignObject.
| -rw-r--r-- | django/db/models/sql/query.py | 11 | ||||
| -rw-r--r-- | tests/composite_pk/test_filter.py | 5 |
2 files changed, 10 insertions, 6 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index f332d83946..f0865f5f78 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1249,12 +1249,11 @@ class Query(BaseExpression): @property def _subquery_fields_len(self): - if self.has_select_fields: - return sum( - len(self.model._meta.pk_fields) if field == "pk" else 1 - for field in self.selected - ) - return len(self.model._meta.pk_fields) + if not self.has_select_fields or not self.select: + return len(self.model._meta.pk_fields) + return len(self.select) + sum( + len(expr.targets) - 1 for expr in self.select if isinstance(expr, ColPairs) + ) def resolve_expression(self, query, *args, **kwargs): clone = self.clone() diff --git a/tests/composite_pk/test_filter.py b/tests/composite_pk/test_filter.py index d7ecfbec11..c4b393d6ea 100644 --- a/tests/composite_pk/test_filter.py +++ b/tests/composite_pk/test_filter.py @@ -460,6 +460,11 @@ class CompositePKFilterTests(TestCase): queryset = User.objects.filter(comments__in=subquery) self.assertSequenceEqual(queryset, (self.user_2,)) + def test_filter_comments_by_users_subquery(self): + subquery = Comment.objects.filter(id=3).values("user") + queryset = Comment.objects.filter(user__in=subquery) + self.assertSequenceEqual(queryset, (self.comment_3,)) + def test_cannot_cast_pk(self): msg = "Cast expression does not support composite primary keys." with self.assertRaisesMessage(ValueError, msg): |
