だから、あなたが欲しいのは「ボンネットの下に」たまたまJsonPropertyはBlobPropertyのサブクラスであることには何のデータストアに保存されますが、それを取り出す時にデコードされない時にエンコードされます辞書を...持っていることデータストアに書き込まれるたびにコード化され(json.dumps())、読み取られるたびにデコードされます(json.loads())。 これは、これらの関数の1つを削除するproperty subclassでのみ行うことができます(ただし、エンティティの状態に応じてプロパティに対して異なる動作を持たせることは賢明ではないと思います)。ただ、「教育目的は、」あなたは、私はJsonPropertyを使用して辞書を返します。新しいプロパティ・メソッドを追加することをお勧めあなたのコード内で辞書を利用するために必要がある場合は、
from google.appengine.ext import ndb
import json
class ExtendedJsonProperty(ndb.BlobProperty):
def _to_base_type(self, value):
return json.dumps(value)
def _from_base_type(self, value):
return value
# originally return json.loads(value)
class DataForBrowser(ndb.Model):
json = ExtendedJsonProperty()
data = {'a': 'A'}
data_for_browser = DataForBrowser()
data_for_browser.json = data
print type(data_for_browser.json) # returns <type 'dict'>
data_for_browser.put()
print type(data_for_browser.json) # returns <type 'str'>
data_for_browser_retrieverd = DataForBrowser.query().get()
print type(data_for_browser_retrieverd.json) # returns <type 'str'>
何が起こるか見てみましょうについてJSONとして使用し、それを使用します。
@property
def json_as_json(self):
return json.dumps(self.json)
あなたはJSONデータを作成するだけのdictを使用する場合は、単にプロパティ
にデータを割り当てる前BlobPropertyを使用してjson.dumps(通過)はい、それはに似ています私が現在やっていること。 JSON文字列を 'JsonProperty'から返すだけの"バックドア "メソッド(Hookメソッドのような)があるかどうか疑問に思っています。 'ExtendedJsonProperty'を紹介するのは後ろに行くようです。 –
データストアからデータをフェッチした直後に_from_base_type()メソッドが呼び出されたため、これは可能ではないと思います。その時点から、元のデータにはもうアクセスできません。 – nizz
これは私が欲しかった答えではありませんが、正しい答えだと思います。 –