Appengine ndb:区分创建和编辑?

时间:2014-06-24 07:15:24

标签: python entity-framework google-app-engine

我在models.py中有以下代码:

class Order(ndb.Model):
  created_at = ndb.DateTimeProperty(auto_now_add=True)
  updated_at = ndb.DateTimeProperty(auto_now=True)
  name = ndb.StringProperty()
  due_dates = ndb.DateProperty(repeated=True)

class Task(ndb.Model):
  created_at = ndb.DateTimeProperty(auto_now_add=True)
  updated_at = ndb.DateTimeProperty(auto_now=True)

  order = ndb.KeyProperty(required=True)
  order_updated_at = ndb.DateTimeProperty(required=True)
  ...

创建订单时,将创建6个任务。目前,我有以下方法:

  def _post_put_hook(self, future):
    # Deleting old tasks
    tbd = Task.query(Task.order == self.key).fetch(keys_only=True)
    ndb.delete_multi(tbd)

    # Generating new tasks
    for entry in self.entries:
      pt = entry.producetype.get()
      # Now create Tasks and store them into the database
      Task(order=self.key,
           order_updated_at=self.updated_at,
           order_entry_serial=entry.serial,
           date=dt_sowing,
           action=TaskAction.SOWING).put()

现在我正在改变Order和Task的创建方式。 我想在创建订单时创建任务,并且我想在修改订单时删除订单的任务

不幸的是,ndb的API声明:

  

数据存储区API不区分创建新实体   并更新现有的。如果对象的键表示实体   已存在的put()方法将覆盖现有实体。   您可以使用事务来测试具有给定键的实体   在创建之前存在。另请参见Model.get_or_insert()方法。

我真的不明白如何在我的场景中应用Model.get_or_insert。 请注意,我无法使用_pre_put_hooks,因为我的任务需要通过其密钥引用其订单。

1 个答案:

答案 0 :(得分:0)

忽略get_or_insert(),它在任何情况下都会返回一个实体而对您没有帮助。您需要检查数据存储区中是否存在任务。我想在get()中包含get_multi()try/except函数。如果实体存在,则删除它,否则创建6个具有put_multi()的新任务实体。

编辑:您需要时间戳来检查预先存在。查看datetime property和auto_now_add / auto_now选项。