【问题标题】:Appengine ndb: differentiating between creating and editing?Appengine ndb:区分创建和编辑?
【发布时间】: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


    【解决方案1】:

    忽略get_or_insert(),无论如何它都会返回一个实体并且对您没有帮助。您需要检查数据存储中是否存在任务。我想将get()get_multi() 函数包装在try/except 中。如果实体存在,则将其删除,否则创建 6 个新的任务实体,带有 put_multi()

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

    【讨论】:

    • 我应该把get() 电话放在哪里?我把它放在pre_put_hook 吗?如果是这样,我如何将 Order.key 分配给新任务?如果我把它放在 post_put_hook 中,那 key 不是一直存在吗?
    • 对不起,我没听懂。但是, get_or_insert() 没有帮助,您需要时间戳来检查是否存在。查看datetime 属性和 auto_now_add/auto_now 选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多