summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
Diffstat (limited to 'django/utils')
-rw-r--r--django/utils/functional.py10
1 files changed, 10 insertions, 0 deletions
diff --git a/django/utils/functional.py b/django/utils/functional.py
index 1bd2286728..183c24ced3 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -261,6 +261,16 @@ class SimpleLazyObject(LazyObject):
else:
return copy.deepcopy(self._wrapped, memo)
+ # Because we have messed with __class__ below, we confuse pickle as to what
+ # class we are pickling. It also appears to stop __reduce__ from being
+ # called. So, we define __getstate__ in a way that cooperates with the way
+ # that pickle interprets this class. This fails when the wrapped class is a
+ # builtin, but it is better than nothing.
+ def __getstate__(self):
+ if self._wrapped is empty:
+ self._setup()
+ return self._wrapped.__dict__
+
# Need to pretend to be the wrapped class, for the sake of objects that care
# about this (especially in equality tests)
__class__ = property(new_method_proxy(operator.attrgetter("__class__")))