diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2010-04-21 16:34:33 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2010-04-21 16:34:33 +0000 |
| commit | 3fb57d47bd8d4f6c1d61c9fd9564ae6c1c262027 (patch) | |
| tree | 16e76b00e62efeba6ed61ae4dd7b4cc4a6ebb13c /django/db/models/sql/where.py | |
| parent | e8eac3290126d94580618cb4dac44cd2a7d258d6 (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.py | 26 |
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) |
