summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/sql/where.py2
-rw-r--r--django/utils/tree.py16
-rw-r--r--tests/utils_tests/test_tree.py4
3 files changed, 9 insertions, 13 deletions
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index dbfd9a02a4..d3e08cc65e 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -171,7 +171,7 @@ class WhereNode(tree.Node):
self.children[pos] = child.relabeled_clone(change_map)
def clone(self):
- clone = self.__class__._new_instance(
+ clone = self.__class__.create(
children=None,
connector=self.connector,
negated=self.negated,
diff --git a/django/utils/tree.py b/django/utils/tree.py
index f67c90eae4..e82afe9bf7 100644
--- a/django/utils/tree.py
+++ b/django/utils/tree.py
@@ -25,17 +25,13 @@ class Node:
self.connector = connector or self.default
self.negated = negated
- # Required because django.db.models.query_utils.Q. Q. __init__() is
- # problematic, but it is a natural Node subclass in all other respects.
@classmethod
- def _new_instance(cls, children=None, connector=None, negated=False):
+ def create(cls, children=None, connector=None, negated=False):
"""
- Create a new instance of this class when new Nodes (or subclasses) are
- needed in the internal code in this class. Normally, it just shadows
- __init__(). However, subclasses with an __init__ signature that aren't
- an extension of Node.__init__ might need to implement this method to
- allow a Node to create a new instance of them (if they have any extra
- setting up to do).
+ Create a new instance using Node() instead of __init__() as some
+ subclasses, e.g. django.db.models.query_utils.Q, may implement a custom
+ __init__() with a signature that conflicts with the one defined in
+ Node.__init__().
"""
obj = Node(children, connector, negated)
obj.__class__ = cls
@@ -97,7 +93,7 @@ class Node:
node other got squashed or not.
"""
if self.connector != conn_type:
- obj = self._new_instance(self.children, self.connector, self.negated)
+ obj = self.create(self.children, self.connector, self.negated)
self.connector = conn_type
self.children = [obj, data]
return data
diff --git a/tests/utils_tests/test_tree.py b/tests/utils_tests/test_tree.py
index 81002e68c9..04223964ba 100644
--- a/tests/utils_tests/test_tree.py
+++ b/tests/utils_tests/test_tree.py
@@ -69,11 +69,11 @@ class NodeTests(unittest.TestCase):
self.node1.negate()
self.assertFalse(self.node1.negated)
- def test_new_instance(self):
+ def test_create(self):
SubNode = type("SubNode", (Node,), {})
a = SubNode([SubNode(["a", "b"], OR), "c"], AND)
- b = SubNode._new_instance(a.children, a.connector, a.negated)
+ b = SubNode.create(a.children, a.connector, a.negated)
self.assertEqual(a, b)
# Children lists are the same object, but equal.
self.assertIsNot(a.children, b.children)