我正在使用google.appengine.ext.ndb
进行存储。
我将实体X
和put()
创建到数据存储区。然后,在将来的Web请求中,我查询实体X
,更改字段,然后再次put()
。
当我访问开发控制台时,我看到实体X
的两个副本:一个预修改和一个后修改。两个对象的实体键相同,但ID字段不同。例如,屏幕截图中的三个StepModel
对象应该都是同一个对象。首先我创建了它(顶行),然后我更改了step_data
字段和put()
它(中间行),然后我再次更改了step_data
字段和put()
字段。
以下是我最初用于创建对象的代码:
experiment = self.loadExperiment() # Loads from DataStore using Session ID
step_obj = StepModel(name=step_def.Name(), number=step_num, step_data="{}")
step_obj.put()
experiment.steps.append(step_obj)
experiment.put()
以下是我用来更新和保存对象的代码:
experiment = self.loadExperiment() # Loads from DataStore using Session ID
step_data = json.loads(experiment.steps[step_num].step_data)
#
# Code which changes step_data here
#
experiment.steps[step_num].step_data = json.dumps(step_data)
experiment.steps[step_num].put()
experiment.put()
self.loadExperiment()
函数定义如下
def loadExperiment(self):
if self.session.get('experiment_key'):
experiment_key = ndb.Key(urlsafe=self.session.get('experiment_key'))
experiment = experiment_key.get()
return experiment
else:
return None
以前使用以下代码创建了实验对象(在单独的Web请求中):
em = ExperimentModel(name=self.Title(), path=self.ExperimentPath())
em.put()
self.session['experiment_key'] = em.key.urlsafe()
ExperimentModel
对象在数据库中不会像StepModel
objet那样重复。
发生了什么事?这是一个仅用于调试的开发功能吗?我当然不希望我的对象的旧版本在生产数据库中存在。
提前感谢您可以解决的任何问题。