我已将我的对象更改为在v2中拥有新的必需属性。当我尝试从数据存储区中获取v1对象时,我得到BadValueError,因为v1没有必需的属性。在现有数据上引入新的必需属性的最佳方法是什么
答案 0 :(得分:6)
我会使用mapreduce库解决此问题。
首先,在mapreduce.yaml
注册映射器:
mapreduce:
- name: fixing required property
mapper:
input_reader: mapreduce.input_readers.DatastoreInputReader
handler: your handler
params:
- name: entity_kind
default: main.ModelV2
然后定义process
函数来修改实体:
from mapreduce import operation as op
def process(entity):
if not entity.newproperty :
entity.newproperty = None
yield op.db.Put(entity)
如果你正在处理相对较少数量的实体,你可以避免mapreduce直接修改你的实体,如下所示:
entities = ModelV2.all()
for entity in entities :
if not entity.newproperty :
entity.newproperty = None
entity.put()
答案 1 :(得分:3)
您需要将它作为可选属性添加到模型中,获取每个现有实体,向其添加属性(以某种方式生成合理的值),然后将()放入实体。一旦所有现有实体都已“升级”,您就可以使该属性成为必需属性。
AppEngine mapreduce API应该可以很容易。