@@ -81,6 +81,28 @@ def tree_node_correct_field_specs(my_model, node):
8181 return potential_q_object
8282
8383
84+ def _deepcopy_q_object (q ):
85+ """
86+ Make a deepcopy of a Q-object.
87+ """
88+ def _copy_child (child ):
89+ if isinstance (child , tuple ):
90+ return child # tuples are immutable, no need to make a copy.
91+ elif isinstance (child , Q ):
92+ return _deepcopy_q_object (child )
93+ else :
94+ raise RuntimeError ("Unknown child type: %s" , type (child ))
95+
96+ children = [_copy_child (c ) for c in q .children ]
97+
98+ if hasattr (q , 'copy' ): # Django 4.2+
99+ obj = q .copy ()
100+ obj .children = children
101+ else :
102+ obj = Q (* children , _connector = q .connector , _negated = q .negated )
103+ return obj
104+
105+
84106def translate_polymorphic_filter_definitions_in_args (queryset_model , args , using = DEFAULT_DB_ALIAS ):
85107 """
86108 Translate the non-keyword argument list for PolymorphicQuerySet.filter()
@@ -93,7 +115,7 @@ def translate_polymorphic_filter_definitions_in_args(queryset_model, args, using
93115 Returns: modified Q objects
94116 """
95117 return [
96- translate_polymorphic_Q_object (queryset_model , copy . deepcopy (q ), using = using ) for q in args
118+ translate_polymorphic_Q_object (queryset_model , _deepcopy_q_object (q ), using = using ) for q in args
97119 ]
98120
99121
0 commit comments