我的模型类如下所示:
from google.appengine.ext import db
class SnapShotBase(db.Model):
'''
The base class from which all entity snapshots will inherit.
'''
version = db.IntegerProperty()
def __init__(self):
pass
想象一下,我已经在我的bigtable数据存储中保留了这个类的实例。如果我要在这个类中添加一个字段,是否会破坏反序列化?或者新属性是否会保持空白?
答案 0 :(得分:3)
模型实例不使用标准序列化(如Pickle)存储。属性(例如示例中的“版本”)被编码并存储为协议缓冲区,当您从数据存储区加载实体时,协议缓冲区将被解码并用于构建新的模型实例。
因此,您可以根据需要修改对象。添加新属性将导致它们在添加之前存储的任何实体具有其默认值,或者如果需要新属性且未提供默认值则抛出错误。删除字段只会导致它们不再显示在模型实例上。
但是有一个警告:您不应该像上面那样覆盖模型类中的 init 。这样做可能会破坏数据存储区中实体的构造。如果你需要修改构造行为,我建议改为使用工厂方法(或函数)。