diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2009-11-11 13:08:33 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2009-11-11 13:08:33 +0000 |
| commit | 6ec45f3cb487d5faf50240072bf1440ff336b506 (patch) | |
| tree | d355069346cb41ef04be416281ef21e826308778 /django | |
| parent | abd4344efe6bc9b138595a7d15998a0cbce5b9cf (diff) | |
[1.1.X] Fixed #12163 -- Corrected the unpickling of non-deferred models. Thanks to rfugger for the report and test case.
Backport of r11732 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@11733 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/base.py | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py index edac99d6c9..144fea5af2 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -368,6 +368,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): @@ -378,8 +380,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: @@ -659,12 +662,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 |
