diff --git a/polymorphic/query_translate.py b/polymorphic/query_translate.py index 2974f4cb..7555ae5a 100644 --- a/polymorphic/query_translate.py +++ b/polymorphic/query_translate.py @@ -81,6 +81,25 @@ def tree_node_correct_field_specs(my_model, node): return potential_q_object +def _deepcopy_q_object(q): + """ + Make a deepcopy of a Q-object. + """ + def _copy_child(child): + if isinstance(child, tuple): + return child # tuples are immutable, no need to make a copy. + elif isinstance(child, Q): + return _deepcopy_q_object(child) + else: + raise RuntimeError("Unknown child type: %s", type(child)) + + obj = type(q).create( + connector=q.connector, + negated=q.negated, + children=[_copy_child(c) for c in q.children]) + return obj + + def translate_polymorphic_filter_definitions_in_args(queryset_model, args, using=DEFAULT_DB_ALIAS): """ Translate the non-keyword argument list for PolymorphicQuerySet.filter() @@ -93,7 +112,7 @@ def translate_polymorphic_filter_definitions_in_args(queryset_model, args, using Returns: modified Q objects """ return [ - translate_polymorphic_Q_object(queryset_model, copy.deepcopy(q), using=using) for q in args + translate_polymorphic_Q_object(queryset_model, _deepcopy_q_object(q), using=using) for q in args ]