summaryrefslogtreecommitdiff
path: root/django/db/models/base.py
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2009-11-11 13:06:18 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2009-11-11 13:06:18 +0000
commit632f12fba48af1edbd92c722a09a5f7602315b3f (patch)
tree395dbdd157df8c356fffbe1ff7ee8bb8e0211b42 /django/db/models/base.py
parent3f8f3f8411650bd328cd4054941c18ff9da1d1f6 (diff)
Fixed #12163 -- Corrected the unpickling of non-deferred models. Thanks to rfugger for the report and test case.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11732 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/base.py')
-rw-r--r--django/db/models/base.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index c7f6ba2f7c..47c177295d 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -361,6 +361,8 @@ class Model(object):
defers = []
pk_val = None
if self._deferred:
+ from django.db.models.query_utils import deferred_class_factory
+ factory = deferred_class_factory
for field in self._meta.fields:
if isinstance(self.__class__.__dict__.get(field.attname),
DeferredAttribute):
@@ -371,8 +373,9 @@ class Model(object):
# once.
obj = self.__class__.__dict__[field.attname]
model = obj.model_ref()
-
- return (model_unpickle, (model, defers), data)
+ else:
+ factory = simple_class_factory
+ return (model_unpickle, (model, defers, factory), data)
def _get_pk_val(self, meta=None):
if not meta:
@@ -657,12 +660,20 @@ def get_absolute_url(opts, func, self, *args, **kwargs):
class Empty(object):
pass
-def model_unpickle(model, attrs):
+def simple_class_factory(model, attrs):
+ """Used to unpickle Models without deferred fields.
+
+ We need to do this the hard way, rather than just using
+ the default __reduce__ implementation, because of a
+ __deepcopy__ problem in Python 2.4
+ """
+ return model
+
+def model_unpickle(model, attrs, factory):
"""
Used to unpickle Model subclasses with deferred fields.
"""
- from django.db.models.query_utils import deferred_class_factory
- cls = deferred_class_factory(model, attrs)
+ cls = factory(model, attrs)
return cls.__new__(cls)
model_unpickle.__safe_for_unpickle__ = True