Google App Engine中的自定义属性。发送到Make_value_from_datastore的值不是保存的类型

时间:2012-03-06 16:28:16

标签: python google-app-engine google-cloud-datastore

我正在尝试将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>

1 个答案:

答案 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))