我在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
,因为我的任务需要通过其密钥引用其订单。
答案 0 :(得分:0)
忽略get_or_insert()
,它在任何情况下都会返回一个实体而对您没有帮助。您需要检查数据存储区中是否存在任务。我想在get()
中包含get_multi()
或try/except
函数。如果实体存在,则删除它,否则创建6个具有put_multi()
的新任务实体。
编辑:您需要时间戳来检查预先存在。查看datetime property和auto_now_add / auto_now选项。