在我正在编写的Python Google App Engine应用程序中,我有一个实体存储在数据存储中,需要检索它,对它进行精确复制(除了键),然后将这个实体放回。
我该怎么做?尤其是,我在做这件事的时候,有没有什么需要注意的注意事项或技巧,这样我就可以得到我所期望的那种,而不是别的。
预计到达时间:嗯,我试过了,确实遇到了问题。我希望在编写代码时不必知道属性的名称就可以复制。我的想法是:
#theThing = a particular entity we pull from the datastore with model Thing
copyThing = Thing(user = user)
for thingProperty in theThing.properties():
copyThing.__setattr__(thingProperty[0], thingProperty[1])
执行时没有任何错误。。。直到我尝试从数据存储中提取copyThing,这时我发现所有属性都设置为None(显然,除了用户和键之外)。很明显,这段代码正在做一些事情,因为它将默认值替换为无(所有属性都有一个默认值集),但完全不是我想要的。建议?
如果您使用的是NDB,您可以简单地复制:
new_entity.populate(**old_entity.to_dict())
这只是Nick Johnson's excellent code的一个扩展,用于解决Amir在注释中突出显示的问题:
auto_now
和/或auto_now_add
标志指定是否要跳过DateTime属性。下面是更新的代码:
第一个
if
表达式不是很优雅,因此如果您能分享一个更好的方法来编写它,我将不胜感激。给你:
示例用法:
编辑:使用NDB时的更改
将下面Gus的注释与指定不同数据存储名称的属性的修复结合起来,以下代码适用于NDB:
示例用法(注意
key_name
在NDB中变成id
):附带说明:请参见使用
_code_name
来获取Python友好的属性名。否则,像name = ndb.StringProperty('n')
这样的属性将导致模型构造函数引发AttributeError: type object 'foo' has no attribute 'n'
。相关问题 更多 >
编程相关推荐