Skip to content
Snippets Groups Projects
Select Git revision
  • fc7d532a14d3f59ff66e5e485aea911b636fb304
  • test default protected
  • master protected
  • original
  • pirati-backup protected
  • beta-2
  • beta-1
  • v3.1.4
  • v3.1.3
  • v3.1.2
  • v3.1.1
  • v3.1.0
  • v3.0.16
  • v3.0.15
  • v3.0.14
  • v3.0.13
  • v3.0.12
  • v3.0.11
  • v3.0.10
  • v3.0.9
  • v3.0.8
  • v3.0.7
  • v3.0.6
  • v3.0.5
  • v3.0.4
25 results

jsonfield.py

Blame
  • user avatar
    Ben Adida authored
    d26282f1
    History
    jsonfield.py 2.11 KiB
    """
    taken from
    
    http://www.djangosnippets.org/snippets/377/
    """
    
    import datetime, json
    from django.db import models
    from django.db.models import signals
    from django.conf import settings
    from django.core.serializers.json import DjangoJSONEncoder
    
    class JSONField(models.TextField):
        """
        JSONField is a generic textfield that neatly serializes/unserializes
        JSON objects seamlessly.
        
        deserialization_params added on 2011-01-09 to provide additional hints at deserialization time
        """
    
        # Used so to_python() is called
        __metaclass__ = models.SubfieldBase
    
        def __init__(self, json_type=None, deserialization_params=None, **kwargs):
            self.json_type = json_type
            self.deserialization_params = deserialization_params
            super(JSONField, self).__init__(**kwargs)
    
        def to_python(self, value):
            """Convert our string value to JSON after we load it from the DB"""
    
            if self.json_type:
                if isinstance(value, self.json_type):
                    return value
    
            if isinstance(value, dict) or isinstance(value, list):
                return value
    
            if value == "" or value == None:
                return None
    
            try:
                parsed_value = json.loads(value)
            except:
                raise Exception("not JSON")
    
            if self.json_type and parsed_value:
                parsed_value = self.json_type.fromJSONDict(parsed_value, **self.deserialization_params)
                    
            return parsed_value
    
        # we should never look up by JSON field anyways.
        # def get_prep_lookup(self, lookup_type, value)
    
        def get_prep_value(self, value):
            """Convert our JSON object to a string before we save"""
            if isinstance(value, basestring):
                return value
    
            if value == None:
                return None
    
            if self.json_type and isinstance(value, self.json_type):
                the_dict = value.toJSONDict()
            else:
                the_dict = value
    
            return json.dumps(the_dict, cls=DjangoJSONEncoder)
    
    
        def value_to_string(self, obj):
            value = self._get_val_from_obj(obj)
            return self.get_db_prep_value(value)