8

Python辞書をデータストアに保存する良い方法はありますか?私は次のようなことをしたいです:

from google.appengine.ext import db

class Recipe(db.Model):
  name = db.StringProperty()
  style = db.StringProperty()
  yeast = db.StringProperty()
  hops = db.ListofDictionariesProperty()

もちろん、その最後の行は実際には機能しません。キーと値のペアのリストであるホップが必要です。キーは常に文字列であり、値は文字列、int、またはfloatにすることができますが、それを実行できるものは何も表示されません。プロパティクラス

4

7 に答える 7

7

でdictをシリアル化するreprことは、それを行うための良い方法です。次に、を使用して再構成できます。evalデータが信頼できない場合は、「安全な評価」を使用して再構成できます。

ピクルスに対するreprの利点は、データがデータベースで読み取り可能であり、絶望的な場合でもクエリ可能であるということです。

于 2009-11-11T18:09:30.787 に答える
7

jsonを使用できます

于 2009-11-11T19:44:58.957 に答える
2

辞書をピクルスにして、StringPropertyとして保存することができます。

于 2009-11-11T18:06:11.420 に答える
2

Python辞書を保存する方法はないと確信しています。しかし、2番目のモデルとして、必要なものをホップに配置してみませんか?

また、Johnが述べたように、pickleを使用することもできますが、(間違っている場合は修正して)代わりにBlob値として保存します。

于 2009-11-11T18:09:36.980 に答える
1

基本的に、オプションは、pickleを使用するか、db.Expandoを使用して、dictの各キーを個別のプロパティにするか、キーと値の1つのStringListPropertyを使用して、読み取り時にそれらをdictに戻すことです。

于 2009-11-11T18:10:24.807 に答える
1

JsonPropertyを使用できます。値は、Pythonのjsonモジュールを使用してシリアル化可能なPythonオブジェクト(リスト、dict、文字列など)です。Cloud Datastoreは、JSONシリアル化をblobとして保存します。デフォルトではインデックスが作成されていません。オプションのキーワード引数:圧縮。

from google.appengine.ext import ndb

class Article(ndb.Model):
    title = ndb.StringProperty(required=True)
    stars = ndb.IntegerProperty()
    tags = ndb.StringProperty(repeated=True)
    info = ndb.JsonProperty()
于 2018-08-17T22:59:09.070 に答える
0

私はこのようにしました:

class MyEntity(db.Model):
    dictionary_string = db.StringProperty()

payload = {{}...{}}

# Store dict
my_entity = MyEntity(key_name=your_key_here)
my_entity.dictionary_string = str(payload)
my_entity.put()

# Get dict
import ast
my_entity_k = db.Key.from_path('MyEntity', your_key_here)
my_entity = db.get(my_entity_k)
payload = ast.literal_eval(my_entity.dictionary_string)
于 2013-05-15T08:54:37.810 に答える