如何在google appengine上制作持久的python字典

时间:2010-07-08 12:30:46

标签: python dictionary persistence

使用appengine的数据存储框架,什么是使持久性成为{}的pythonic方法?

3 个答案:

答案 0 :(得分:5)

如果您打算查询单个词典元素,则只需要使用expando选项。

假设您不想这样做,那么您可以使用自定义属性 -

class ObjectProperty(db.Property):
  data_type = db.Blob

  def get_value_for_datastore(self, model_instance):
    value = self.__get__(model_instance, model_instance.__class__)
    pickled_val = pickle.dumps(value)
    if value is not None: return db.Blob(pickled_val)

  def make_value_from_datastore(self, value):
    if value is not None: return pickle.loads(str(value))

  def default_value(self):
    return copy.copy(self.default)

请注意,上面的属性def来自Nick Johnson制作的一些代码。它是project on git hub,包含许多其他自定义属性。

答案 1 :(得分:3)

您应该使用pickle.dumps存储它并使用pickle.loads

检索它

见  http://docs.python.org/library/pickle.html

答案 2 :(得分:2)

我认为有两种选择。

  1. 使用expando。只要省略保留字段,就可以存储任何内容:

    class SomeModel(db.Expando):
        pass
    
    your_model = SomeModel()
    for k, v in your_dict.iteritems():
        setattr(your_model, k, v)
    

    有可能使用your_model.__dict__.update(your_dict),但我不确定。

  2. 使用pickle

    将其存储在文本字段中
    class SomeModel(db.Model):
        pickled_data = db.BlobProperty()
    
    your_model = SomeModel()
    your_model.pickled_data = pickle.dumps(your_dict)