summaryrefslogtreecommitdiff
path: root/django/db/models/base.py
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2009-11-01 03:04:20 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2009-11-01 03:04:20 +0000
commit08d521efa0de350991a3e72736b0490d747ccc05 (patch)
tree98f78af6f38b78b34e25877ac19c8eee99990527 /django/db/models/base.py
parent8dd4a28721918ee0f42f6698b2c7403f75b25646 (diff)
Fixed #12121 -- Modified __reduce__ on a model to avoid an infinite recursion problem that occurs on Python 2.4. Thanks to emulbreh for the report.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11691 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/base.py')
-rw-r--r--django/db/models/base.py29
1 files changed, 17 insertions, 12 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 2c05009823..ce8dda204a 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -352,20 +352,25 @@ class Model(object):
only module-level classes can be pickled by the default path.
"""
data = self.__dict__
- if not self._deferred:
- return super(Model, self).__reduce__()
+ model = self.__class__
+ # The obvious thing to do here is to invoke super().__reduce__()
+ # for the non-deferred case. Don't do that.
+ # On Python 2.4, there is something wierd with __reduce__,
+ # and as a result, the super call will cause an infinite recursion.
+ # See #10547 and #12121.
defers = []
pk_val = None
- for field in self._meta.fields:
- if isinstance(self.__class__.__dict__.get(field.attname),
- DeferredAttribute):
- defers.append(field.attname)
- if pk_val is None:
- # The pk_val and model values are the same for all
- # DeferredAttribute classes, so we only need to do this
- # once.
- obj = self.__class__.__dict__[field.attname]
- model = obj.model_ref()
+ if self._deferred:
+ for field in self._meta.fields:
+ if isinstance(self.__class__.__dict__.get(field.attname),
+ DeferredAttribute):
+ defers.append(field.attname)
+ if pk_val is None:
+ # The pk_val and model values are the same for all
+ # DeferredAttribute classes, so we only need to do this
+ # once.
+ obj = self.__class__.__dict__[field.attname]
+ model = obj.model_ref()
return (model_unpickle, (model, defers), data)