@@ -67,33 +67,35 @@ class Creator(object):
67
67
Taken from django.db.models.fields.subclassing.
68
68
"""
69
69
70
- _parent_key = '_json_field_cache '
70
+ _state_key = '_json_field_state '
71
71
72
- def __init__ (self , field ):
72
+ def __init__ (self , field , lazy ):
73
73
self .field = field
74
+ self .lazy = lazy
74
75
75
76
def __get__ (self , obj , type = None ):
76
77
if obj is None :
77
78
raise AttributeError ('Can only be accessed via an instance.' )
78
79
79
- cache = getattr (obj , self ._parent_key , None )
80
- if cache is None :
81
- cache = {}
82
- setattr (obj , self ._parent_key , cache )
80
+ if self .lazy :
81
+ state = getattr (obj , self ._state_key , None )
82
+ if state is None :
83
+ state = {}
84
+ setattr (obj , self ._state_key , state )
83
85
84
- key = '%s_deserialized' % self .field .name
86
+ if state .get (self .field .name , False ):
87
+ return obj .__dict__ [self .field .name ]
85
88
86
- if cache .get (key , False ):
87
- return obj .__dict__ [self .field .name ]
88
-
89
- value = self .field .to_python (obj .__dict__ [self .field .name ])
90
- obj .__dict__ [self .field .name ] = value
91
- cache [key ] = True
89
+ value = self .field .to_python (obj .__dict__ [self .field .name ])
90
+ obj .__dict__ [self .field .name ] = value
91
+ state [self .field .name ] = True
92
+ else :
93
+ value = obj .__dict__ [self .field .name ]
92
94
93
95
return value
94
96
95
97
def __set__ (self , obj , value ):
96
- obj .__dict__ [self .field .name ] = value # deserialized when accessed
98
+ obj .__dict__ [self .field .name ] = value if self . lazy else self . field . to_python ( value )
97
99
98
100
class JSONField (models .TextField ):
99
101
""" Stores and loads valid JSON objects. """
@@ -107,6 +109,7 @@ def __init__(self, *args, **kwargs):
107
109
self ._db_type = kwargs .pop ('db_type' , None )
108
110
self .evaluate_formfield = kwargs .pop ('evaluate_formfield' , False )
109
111
112
+ self .lazy = kwargs .pop ('lazy' , True )
110
113
encoder = kwargs .pop ('encoder' , DjangoJSONEncoder )
111
114
decoder = kwargs .pop ('decoder' , JSONDecoder )
112
115
encoder_kwargs = kwargs .pop ('encoder_kwargs' , {})
@@ -170,7 +173,7 @@ def set_json(model_instance, value):
170
173
return setattr (model_instance , self .attname , self .to_python (value ))
171
174
setattr (cls , 'set_%s_json' % self .name , set_json )
172
175
173
- setattr (cls , name , Creator (self )) # deferred deserialization
176
+ setattr (cls , name , Creator (self , lazy = self . lazy )) # deferred deserialization
174
177
175
178
try :
176
179
# add support for South migrations
0 commit comments