Skip to content

Instantly share code, notes, and snippets.

@playpauseandstop
Created March 31, 2010 13:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save playpauseandstop/350281 to your computer and use it in GitHub Desktop.
Save playpauseandstop/350281 to your computer and use it in GitHub Desktop.
Custom Django model field to store pickled Python objects.
from django.conf import settings
from django.db import models
from django.utils.encoding import smart_str
if hasattr(settings, 'USE_CPICKLE'):
import cPickle as pickle
else:
import pickle
class PickleField(models.TextField):
"""
Custom field that enables to store pickled Python objects.
"""
__metaclass__ = models.SubfieldBase
editable = False
serialize = False
def get_db_prep_value(self, value):
return pickle.dumps(value)
def get_default(self):
if self.has_default():
if callable(self.default):
return self.default()
return self.default
return super(PickleField, self).get_default()
def to_python(self, value):
if not isinstance(value, basestring):
return value
try:
return pickle.loads(smart_str(value))
except (EOFError, IndexError, KeyError, ValueError):
return value
# Make able to store Django model objects in ``PickleField``
def picklefield(func):
def wrapper(obj, field):
if isinstance(field, PickleField):
return field.get_db_prep_save(obj)
return func(obj, field)
return wrapper
models.Model.prepare_database_save = \
picklefield(models.Model.prepare_database_save)
@rafis
Copy link

rafis commented Apr 17, 2018

AttributeError: module 'django.db.models' has no attribute 'SubfieldBase'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment