[Django] #34227: multi level FilteredRelation with select_related may set wrong related object

8 views
Skip to first unread message

Django

unread,
Dec 23, 2022, 7:35:16 AM12/23/22
to django-...@googlegroups.com
#34227: multi level FilteredRelation with select_related may set wrong related
object
-----------------------------------------+------------------------
Reporter: zhu | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 4.1
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-----------------------------------------+------------------------
test case:
{{{
#!python
# add to known_related_objects.tests.ExistingRelatedInstancesTests
def test_wrong_select_related(self):
with self.assertNumQueries(3):
p = list(PoolStyle.objects.annotate(
tournament_pool=FilteredRelation('pool__tournament__pool'),
).select_related('tournament_pool'))
self.assertEqual(p[0].pool.tournament,
p[0].tournament_pool.tournament)

}}}
result:
{{{
======================================================================
FAIL: test_wrong_select_related
(known_related_objects.tests.ExistingRelatedInstancesTests.test_wrong_select_related)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\Work\django\tests\known_related_objects\tests.py", line 171, in
test_wrong_select_related
self.assertEqual(p[0].pool.tournament,
p[0].tournament_pool.tournament)
AssertionError: <Tournament: Tournament object (1)> != <PoolStyle:
PoolStyle object (1)>

----------------------------------------------------------------------
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/34227>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Dec 25, 2022, 9:49:15 PM12/25/22
to django-...@googlegroups.com
#34227: multi level FilteredRelation with select_related may set wrong related
object
-------------------------------+--------------------------------------

Reporter: zhu | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 4.1
Severity: Normal | Resolution:

Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------

Comment (by zhu):

Seems this bug can be fixed by:
{{{
M django/db/models/sql/compiler.py
@@ -1270,6 +1270,9 @@ class SQLCompiler:
if from_obj:
final_field.remote_field.set_cached_value(from_obj,
obj)

+ def no_local_setter(obj, from_obj):
+ pass
+
def remote_setter(name, obj, from_obj):
setattr(from_obj, name, obj)

@@ -1291,7 +1294,7 @@ class SQLCompiler:
"model": model,
"field": final_field,
"reverse": True,
- "local_setter": partial(local_setter,
final_field),
+ "local_setter": partial(local_setter,
final_field) if len(joins) <= 2 else no_local_setter,
"remote_setter": partial(remote_setter, name),
"from_parent": from_parent,
}
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/34227#comment:1>

Reply all
Reply to author
Forward
0 new messages