2012-03-06 12 views
0

Google AppsエンジンのデータストアでJsonPropertyを使用しようとしています。このコードを使用してGoogle App Engineのカスタムプロパティ。 Make_value_from_datastoreに送信された値が保存されたタイプではありません

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) 

(インデントは右の私のコンピュータ上にある)しかし、私は代わりにタイプdb.Textであることの、make_value_from_datastoreで「値」を取得するとき、それはタイプJsonPropertyです。

データストアの文字列が表示され、正しく保存されています。

それがロードされるとJSON「は、文字列をまたはバッファ」欲しい

を私は理解していない、と私のコードと、いくつかの間に違いを見つけることができないので、それは、json.loads(値)にチョークインターネット上の例です。これらはすべて、「値」の値がデータストアに保存された生の型であることを示しています。

+0

NDBに切り替えることはできますか? JsonPropertyが動作しているためです。 (恥知らずなプラグ... :-) –

答えて

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)) 
関連する問題