要将复杂对象存储到数据存储区,我目前正在使用此方法:
class PickleProperty(db.Property):
data_type = db.Blob
def get_value_for_datastore(self, model_instance):
value = self.__get__(model_instance, model_instance.__class__)
if value is not None:
return db.Blob(pickle.dumps(value))
def make_value_from_datastore(self, value):
if value is not None:
return pickle.loads(str(value))
class ComplexModel(db.Model):
data = PickleProperty()
如您所知,Google App Engine没有更高效的cPickle模块;这导致操作非常慢。
任何更好的策略?
答案 0 :(得分:3)
文档说model_to_protobuf
需要Model
个实例,如果您的对象已经是Model
,您也可以直接指向该对象的ReferenceProperty
。我建议你首先使用相当实际的数据对酸洗进行基准测试,以确切地找出 慢速酸洗/去除的方法。它可能不是太慢,但实际上知道在提交工作密集型修复之前,过早优化是邪恶的以及所有这些(你可能知道......)可能是好事。
但如果它实际上很慢,我建议你尝试对需要以较低能力格式进行序列化的对象进行建模(因此可能更快),例如JSON
(这是实用的,因为你已经在app引擎中有JSON
个功能(将其导入为django.utils.simplejson
)。
如果可以将对象序列化为Model
个实例,我建议你这样做。如果在运行时之前不知道所有属性,那么总是有Expando
个模型。