summaryrefslogtreecommitdiff
path: root/django/db/models/sql/where.py
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-04-21 16:34:33 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-04-21 16:34:33 +0000
commit3fb57d47bd8d4f6c1d61c9fd9564ae6c1c262027 (patch)
tree16e76b00e62efeba6ed61ae4dd7b4cc4a6ebb13c /django/db/models/sql/where.py
parente8eac3290126d94580618cb4dac44cd2a7d258d6 (diff)
Fixed #13328 -- Ensured that querysets on models with callable defaults can be pickled. No, really this time. Thanks to Alex for his help brainstorming the solution.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13013 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/sql/where.py')
-rw-r--r--django/db/models/sql/where.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index cf147c6ad9..4e5a647259 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -258,7 +258,7 @@ class ExtraWhere(object):
def __init__(self, sqls, params):
self.sqls = sqls
self.params = params
-
+
def as_sql(self, qn=None, connection=None):
return " AND ".join(self.sqls), tuple(self.params or ())
@@ -270,6 +270,30 @@ class Constraint(object):
def __init__(self, alias, col, field):
self.alias, self.col, self.field = alias, col, field
+ def __getstate__(self):
+ """Save the state of the Constraint for pickling.
+
+ Fields aren't necessarily pickleable, because they can have
+ callable default values. So, instead of pickling the field
+ store a reference so we can restore it manually
+ """
+ obj_dict = self.__dict__.copy()
+ if self.field:
+ obj_dict['model'] = self.field.model
+ obj_dict['field_name'] = self.field.name
+ del obj_dict['field']
+ return obj_dict
+
+ def __setstate__(self, data):
+ """Restore the constraint """
+ model = data.pop('model', None)
+ field_name = data.pop('field_name', None)
+ self.__dict__.update(data)
+ if model is not None:
+ self.field = model._meta.get_field(field_name)
+ else:
+ self.field = None
+
def prepare(self, lookup_type, value):
if self.field:
return self.field.get_prep_lookup(lookup_type, value)