有没有一种在数据存储区中存储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
答案 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 });
})