Commit 24b969d2 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

[1.1.X] Fixed #12876 -- Corrected a problem with recursive relations under...

[1.1.X] Fixed #12876 -- Corrected a problem with recursive relations under deepcopy. Thanks to elachuni for the patch.

Backport of r12700 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12702 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 72a659f8
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ class BaseQuery(object):
        return sql % params

    def __deepcopy__(self, memo):
        result= self.clone()
        result = self.clone(memo=memo)
        memo[id(self)] = result
        return result

@@ -173,7 +173,7 @@ class BaseQuery(object):
        self.quote_cache[name] = r
        return r

    def clone(self, klass=None, **kwargs):
    def clone(self, klass=None, memo=None, **kwargs):
        """
        Creates a copy of the current instance. The 'kwargs' parameter can be
        used by clients to update attributes after copying has taken place.
@@ -198,19 +198,19 @@ class BaseQuery(object):
        obj.dupe_avoidance = self.dupe_avoidance.copy()
        obj.select = self.select[:]
        obj.tables = self.tables[:]
        obj.where = deepcopy(self.where)
        obj.where = deepcopy(self.where, memo=memo)
        obj.where_class = self.where_class
        if self.group_by is None:
            obj.group_by = None
        else:
            obj.group_by = self.group_by[:]
        obj.having = deepcopy(self.having)
        obj.having = deepcopy(self.having, memo=memo)
        obj.order_by = self.order_by[:]
        obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
        obj.distinct = self.distinct
        obj.select_related = self.select_related
        obj.related_select_cols = []
        obj.aggregates = deepcopy(self.aggregates)
        obj.aggregates = deepcopy(self.aggregates, memo=memo)
        if self.aggregate_select_mask is None:
            obj.aggregate_select_mask = None
        else:
@@ -231,7 +231,7 @@ class BaseQuery(object):
            obj._extra_select_cache = self._extra_select_cache.copy()
        obj.extra_tables = self.extra_tables
        obj.extra_order_by = self.extra_order_by
        obj.deferred_loading = deepcopy(self.deferred_loading)
        obj.deferred_loading = deepcopy(self.deferred_loading, memo=memo)
        if self.filter_is_sticky and self.used_aliases:
            obj.used_aliases = self.used_aliases.copy()
        else:
+7 −0
Original line number Diff line number Diff line
@@ -263,6 +263,13 @@ FieldError: Cannot resolve keyword 'reporter_id' into field. Choices are: headli
>>> Reporter.objects.filter(article__reporter__exact=r).distinct()
[<Reporter: John Smith>]

# Regression for #12876 -- Model methods that include queries that
# recursive don't cause recursion depth problems under deepcopy.
>>> r.cached_query = Article.objects.filter(reporter=r)
>>> from copy import deepcopy
>>> deepcopy(r)
<Reporter: John Smith>

# Check that implied __exact also works.
>>> Reporter.objects.filter(article__reporter=r).distinct()
[<Reporter: John Smith>]