【问题标题】:Datastore list of lists数据存储列表列表
【发布时间】:2010-01-08 14:59:43
【问题描述】:

我需要创建一个包含列表的列表属性,例如: db.ListProperty(list(str))

我知道 list(str) 不是受支持的值类型,所以我想象我收到了“ValueError”异常。 想也许有一个创造性的想法来解决这个问题:)

谢谢!

【问题讨论】:

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


    【解决方案1】:

    根据 Adam 的建议,您可以将酸洗推入其自己的 Property 类中。这是一个处理验证并将提供的列表转换为 Blob 类型的示例。提供的列表可以包含任何数据类型或数据类型的组合,因为它只存储一个标准的 Python 列表。

    import pickle
    
    class GenericListProperty(db.Property):
      data_type = db.Blob
    
      def validate(self, value):
        if type(value) is not list:
          raise db.BadValueError('Property %s must be a list, not %s.' % (self.name, type(value), value))
        return value
    
      def get_value_for_datastore(self, model_instance):
        return db.Blob(pickle.dumps(getattr(model_instance,self.name)))
    
      def make_value_from_datastore(self, value):
        return pickle.loads(value)
    

    您可以像使用任何其他财产一样使用它。

    class ModelWithAGenericList(db.Model):
      mylist = GenericListProperty()
    
    class MainHandler(webapp.RequestHandler):
      def get(self):
        db.delete(ModelWithAGenericList.all())
    
        m = ModelWithAGenericList(mylist = [[1,2,3],[4,5,6],6])
        m.put()
    
        m = ModelWithAGenericList.all().fetch(1)[0]
        self.response.out.write(str(m.mylist))
        # Outputs: [[1, 2, 3], [4, 5, 6], 6]
    

    【讨论】:

      【解决方案2】:

      您可以使用 pickle 序列化您的列表并将其存储在 BlobProperty 字段中。

      【讨论】:

        【解决方案3】:

        如果您使用 Java,您可以将列表列表存储为 blob(前提是它们是标准列表并且它们的内容是可序列化的),但这确实会阻止您让数据存储区搜索其内容。

        // -----------------------------------------------
        import java.io.Serializable;
        import java.io.ByteArrayOutputStream;
        import java.io.ObjectOutputStream;
        import java.io.IOException;
        import com.google.appengine.api.datastore.Blob;
        
        Serializable s = (Serializable) myListOfLists;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(s);
            oos.close();
        }catch(IOException ioexception){
        
        }
        entity.setProperty("data", new Blob(baos.toByteArray()));
        
        // -------------------------------------------
        
        import java.io.ByteArrayInputStream;
        import java.io.ObjectInputStream;
        import java.io.IOException;
        import com.google.appengine.api.datastore.Blob;
        
        ByteArrayInputStream bais = new ByteArrayInputStream(((Blob)e.getProperty("data")).getBytes());
        try {
            ObjectInputStream ois = new ObjectInputStream(bais);
            myListOfLists = (List<List<String>>) ois.readObject();
        } catch (IOException e1) {
        
        } catch (ClassNotFoundException e1) {
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-21
          • 2012-04-21
          • 2016-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多