我想为我的appengine应用实现一个简单的VersionedModel基模型类。我在寻找一种模式,它不需要显式地选择要复制的字段。在
我正在尝试这样的东西,但这是为了迎合我的口味,还没有在生产环境中进行测试。在
class VersionedModel(BaseModel):
is_history_copy = db.BooleanProperty(default=False)
version = db.IntegerProperty()
created = db.DateTimeProperty(auto_now_add=True)
edited = db.DateTimeProperty()
user = db.UserProperty(auto_current_user=True)
def put(self, **kwargs):
if self.is_history_copy:
if self.is_saved():
raise Exception, "History copies of %s are not allowed to change" % type(self).__name__
return super(VersionedModel, self).put(**kwargs)
if self.version is None:
self.version = 1
else:
self.version = self.version +1
self.edited = datetime.now() # auto_now would also affect copies making them out of sync
history_copy = copy.copy(self)
history_copy.is_history_copy = True
history_copy._key = None
history_copy._key_name = None
history_copy._entity = None
history_copy._parent = self
def tx():
result = super(VersionedModel, self).put(**kwargs)
history_copy._parent_key = self.key()
history_copy.put()
return result
return db.run_in_transaction(tx)
有没有人有更简单更干净的解决方案来保存appengine模型的版本历史记录?在
编辑:将copy
移出tx.Thx@Adam Crossland以获取建议。在
看看模型类上的properties静态方法。使用此选项,您可以获得属性列表,并使用该列表获取属性值,如下所示:
相关问题 更多 >
编程相关推荐