【发布时间】:2014-06-24 07:15:23
【问题描述】:
我在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()
现在我正在更改订单和任务的创建方式。 我想在创建订单时创建任务并且我想在修改订单时删除订单的任务
不幸的是,ndb 的 API 声明:
Datastore API 不区分创建新实体 并更新现有的。如果对象的键代表一个实体 如果已经存在,put() 方法会覆盖现有实体。 您可以使用事务来测试具有给定键的实体是否 在创建之前存在。另请参见 Model.get_or_insert() 方法。
我不太明白如何在我的场景中应用 Model.get_or_insert。
请注意,我不能使用_pre_put_hooks,因为我的任务需要通过其键引用他们的订单。
【问题讨论】:
标签: python entity-framework google-app-engine