为什么AppEngine Development Console会显示每个对象的多个副本?

时间:2012-08-08 03:40:52

标签: google-app-engine google-cloud-datastore

我正在使用google.appengine.ext.ndb进行存储。

我将实体Xput()创建到数据存储区。然后,在将来的Web请求中,我查询实体X,更改字段,然后再次put()

当我访问开发控制台时,我看到实体X两个副本:一个预修改和一个后修改。两个对象的实体键相同,但ID字段不同。例如,屏幕截图中的三个StepModel对象应该都是同一个对象。首先我创建了它(顶行),然后我更改了step_data字段和put()它(中间行),然后我再次更改了step_data字段和put()字段。

enter image description here

以下是我最初用于创建对象的代码:

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那样重复。

发生了什么事?这是一个仅用于调试的开发功能吗?我当然不希望我的对象的旧版本在生产数据库中存在。

提前感谢您可以解决的任何问题。

0 个答案:

没有答案