mirror of
https://github.com/django/django.git
synced 2025-07-07 19:29:12 +00:00
[4.0.x] Fixed #33159 -- Reverted "Fixed #32970 -- Changed WhereNode.clone() to create a shallow copy of children."
This reverts commit e441847ecae99dd1ccd0d9ce76dbcff51afa863c. A shallow copy is not enough because querysets can be reused and evaluated in nested nodes, which shouldn't mutate JOIN aliases. Thanks Michal Čihař for the report. Backport of 903aaa35e5ceaa33bfc9b19b7f6da65ce5a91dd4 from main
This commit is contained in:
parent
b2a0978610
commit
93a42d43a6
@ -148,7 +148,11 @@ class WhereNode(tree.Node):
|
|||||||
clone = self.__class__._new_instance(
|
clone = self.__class__._new_instance(
|
||||||
children=None, connector=self.connector, negated=self.negated,
|
children=None, connector=self.connector, negated=self.negated,
|
||||||
)
|
)
|
||||||
clone.children = self.children[:]
|
for child in self.children:
|
||||||
|
if hasattr(child, 'clone'):
|
||||||
|
clone.children.append(child.clone())
|
||||||
|
else:
|
||||||
|
clone.children.append(child)
|
||||||
return clone
|
return clone
|
||||||
|
|
||||||
def relabeled_clone(self, change_map):
|
def relabeled_clone(self, change_map):
|
||||||
|
@ -1663,6 +1663,12 @@ class Queries5Tests(TestCase):
|
|||||||
'bar %s'
|
'bar %s'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_queryset_reuse(self):
|
||||||
|
# Using querysets doesn't mutate aliases.
|
||||||
|
authors = Author.objects.filter(Q(name='a1') | Q(name='nonexistent'))
|
||||||
|
self.assertEqual(Ranking.objects.filter(author__in=authors).get(), self.rank3)
|
||||||
|
self.assertEqual(authors.count(), 1)
|
||||||
|
|
||||||
|
|
||||||
class SelectRelatedTests(TestCase):
|
class SelectRelatedTests(TestCase):
|
||||||
def test_tickets_3045_3288(self):
|
def test_tickets_3045_3288(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user