【问题标题】:How to make persistent a python dictionary on google appengine如何在 google appengine 上持久化一个 python 字典
【发布时间】:2010-07-08 12:30:45
【问题描述】:

使用 appengine 的数据存储框架,将持久化为 {} 的 Python 方法是什么?

【问题讨论】:

    标签: python dictionary persistence


    【解决方案1】:

    如果您打算查询单个字典元素,则只需要使用 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)
    

    请注意,我从 Nick Johnson 生成的一些代码中获得了上述属性 def。它是一个project on git hub,并包含许多其他自定义属性。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我认为有两种选择。

        1. 使用扩展。只要省略保留字段,您就可以在其中存储任何内容:

          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)
          

        【讨论】:

        • 如果您使用自定义属性,则无需在每次读取时都显式取消选中该值。没问题。链接:)
        • 确实,您的选择更加优雅:) +1
        猜你喜欢
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多