我正在尝试将JsonProperty与google应用引擎数据存储区一起使用。
使用此代码(缩进在我的计算机上)
class JsonProperty(SerialProperty):
"""Stores a dictionary automatically encoding to JSON on set and decoding
on get.
"""
data_type = dict
def __init__(self, *args, **kwds):
self._require_parameter(kwds, 'indexed', False)
kwds['indexed'] = True
super(JsonProperty, self).__init__(*args, **kwds)
def get_value_for_datastore(self, model_instance):
"""Encodes the value to JSON."""
value = super(JsonProperty, self).get_value_for_datastore(
model_instance)
if value is not None:
return db.Text(json.dumps(value))
else:
return db.Text("{}")
def make_value_from_datastore(self, value):
value=super(JsonProperty, self).make_value_from_datastore(value)
logging.error(value)
"""Decodes the value from JSON."""
if value is not None:
return json.loads(value)
def validate(self, value):
if value is not None and not isinstance(value, (dict, list, tuple)):
raise db.BadValueError('Property %s must be a dict, list or '
'tuple.' % self.name)
但是当我在make_value_from_datastore中获得“value”时,它不是类型db.Text,而是JsonProperty类型。
我可以看到数据存储区中的字符串,并且正确保存。
当它被加载时,它会在json.loads(value)上窒息,因为json想要一个“字符串或缓冲区”
我不明白,并且在我的代码和互联网上的几个示例之间找不到任何区别,所有这些都表明“value”的值应该是保存到数据存储区的原始类型。 / p>
答案 0 :(得分:0)
我猜你得到的值是db.Text值,而不是字符串。这有用吗?
def make_value_from_datastore(self, value):
value=super(JsonProperty, self).make_value_from_datastore(value)
logging.error(value)
"""Decodes the value from JSON."""
if value is not None:
return json.loads(str(value))