Skip to content

Commit 23b6594

Browse files
authored
Fixed #36584, Refs #36149 -- Allowed subquery values against tuple in lookup via ForeignObject.
1 parent 7528979 commit 23b6594

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

django/db/models/sql/query.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,12 +1249,11 @@ def add_annotation(self, annotation, alias, select=True):
12491249

12501250
@property
12511251
def _subquery_fields_len(self):
1252-
if self.has_select_fields:
1253-
return sum(
1254-
len(self.model._meta.pk_fields) if field == "pk" else 1
1255-
for field in self.selected
1256-
)
1257-
return len(self.model._meta.pk_fields)
1252+
if not self.has_select_fields or not self.select:
1253+
return len(self.model._meta.pk_fields)
1254+
return len(self.select) + sum(
1255+
len(expr.targets) - 1 for expr in self.select if isinstance(expr, ColPairs)
1256+
)
12581257

12591258
def resolve_expression(self, query, *args, **kwargs):
12601259
clone = self.clone()

tests/composite_pk/test_filter.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,11 @@ def test_filter_users_by_comments_subquery(self):
460460
queryset = User.objects.filter(comments__in=subquery)
461461
self.assertSequenceEqual(queryset, (self.user_2,))
462462

463+
def test_filter_comments_by_users_subquery(self):
464+
subquery = Comment.objects.filter(id=3).values("user")
465+
queryset = Comment.objects.filter(user__in=subquery)
466+
self.assertSequenceEqual(queryset, (self.comment_3,))
467+
463468
def test_cannot_cast_pk(self):
464469
msg = "Cast expression does not support composite primary keys."
465470
with self.assertRaisesMessage(ValueError, msg):

0 commit comments

Comments
 (0)