3

バルクローダーを使用して App Engine データ ストレージにデータをアップロードしています。

辞書を JsonProperty に保存できないようで、次のエラーが発生します。

BadValueError: プロパティ Nearby_countries のサポートされていない型: <type 'dict'>

私のモデルでは、このプロパティを JsonProperty として定義しています。

Nearby_countries = ndb.JsonProperty()

私が見つけた唯一の回避策は、代わりに私の値の json.dumps() を保存するようですが、これは基本的に辞書自体ではなく辞書の文字列表現を保存していると思います。

JsonProperty についての私の理解は、値として python オブジェクトを取り、ndb が処理する JSON シリアライゼーションについて気にするべきではないということです。私は正しいですか?

値は、Python の json モジュールを使用してシリアル化できる Python オブジェクト (リスト、辞書、または文字列など) です。Datastore は JSON シリアル化を blob として保存します。

4

2 に答える 2

3

多くの試行錯誤と同様の投稿のグーグル検索の後、私は以下の解決策につながる次の投稿を見つけることができました:

http://blog.thekensta.com/2012/06/google-app-engine-bulk-loader-and-ndb.html

つまり、JsonProperties は BLOB として保存され、json 文字列から BLOB を生成するには、正しい変換メソッドをバルクローダーに渡す必要があります。transform.blobproperty_from_base64google.appengine.ext.bulkload.transformモジュールから)使用できます

そこで、リストまたは dict を文字列 JSON 文字列表現に変換し、それを blob に変換して、バルクローダーが保存できるようにします。

import_transform: "ラムダ x: transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(' ,').split(',')))))"

同じ理由で、文字列として保存された TextProperty が修正されます (上記の私のコメントに記載されています)。db.Text変換関数として使用する必要があります。

import_transform: db.Text

repeated=Trueまた、 TextPropertyを保存するには、実際にはそれを BLOB にも変換する必要がありました。

import_transform: "ラムダ x: transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(' ,').split(',')))))"

(上記の例では、コンマ区切りの文字列を Text オブジェクトのリストに変換して、TextProperty(repeated=True)

于 2013-03-01T14:27:11.240 に答える
1

一般的に、JsonProperty については正しいです。ただし、バルクローダーは特別です。正直なところ、私はそれがどのように機能するかについてあまり知りませんが、そのコンテキストでは、json.dumps() を自分で呼び出す必要があるとしても驚かないでしょう。

于 2013-03-01T01:31:56.603 に答える