如何在数据存储区中放置字典?

时间:2009-11-11 18:03:26

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

有没有一种在数据存储区中存储Python字典的好方法?我想做类似以下的事情:

from google.appengine.ext import db

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

当然,最后一行实际上并不起作用。我需要将hops作为键值对的列表,其中键始终是一个字符串,值可以是字符串,整数或浮点数,但我看不到任何内容可以让我在Property classes

7 个答案:

答案 0 :(得分:7)

使用repr序列化dict是一种很好的方法。然后,您可以使用eval重新构建它,或者如果您不信任该数据,则可以使用“safe eval”。

repr over pickling的一个优点是数据在数据库中是可读的,甚至可以在绝望的情况下查询。

答案 1 :(得分:7)

你可以使用json

答案 2 :(得分:2)

您可以pickle字典并将其存储为StringProperty。

答案 3 :(得分:2)

我很确定无法存储Python字典。但是为什么不把你想要的东西作为第二种模型放在啤酒花中呢?

另外,正如约翰所提到的,你可以使用泡菜,但是(如果我错了,请纠正我)将其存储为Blob值。

答案 4 :(得分:1)

你的选择基本上是使用pickle,使用db.Expando并使dict中的每个键成为一个单独的属性,或者有一个StringListProperty的键和一个值和zip()它们在读取时返回到dict

答案 5 :(得分: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)

答案 6 :(得分:0)

您可以使用JsonProperty。 值是可以使用Python的json模块进行序列化的Python对象(例如列表,字典或字符串)。 Cloud Datastore将JSON序列化存储为Blob。默认情况下未索引。 可选关键字参数:已压缩。

var path = [];
var lines = [1, 2, 3];
lines.forEach(function (networkLines){
  path.push({ lat: networkLines });
})