【问题标题】:ndb gae repeated KeyPropery and transactionsndb gae 重复 KeyPropery 和事务
【发布时间】:2014-05-20 11:06:32
【问题描述】:

我在尝试使用这种结构创建实体时遇到了一些问题:

class MainEnt(ndb.Model):
    name = ndb.StringProperty()
    choices = ndb.KeyProperty(repated=True)

    @classmethod
    @ndb.transactional
    def create(cls, name, choices):
        #Here comes my problem!

class Choice(ndb.Model):
    name = ndb.StringProperty()

所以这里我有一个主要实体,其中包含一些选择的列表。 要创建主要实体,我需要使用事务来一致地创建主要实体和选择实体。如果某些操作失败,我希望所有操作都失败。

问题是要在事务中运行都需要在同一个实体组中,但我不能这样做,因为我不知道将其作为父参数分配给每个选项的主实体的键.我不能在事务中使用 allocate_ids,所以这个选项不起作用。

我不想使用Cross-Group事务,也不想两次保存主实体。

我也在考虑使用查询来获取选项并且不使用重复属性,但只要我通常每个 MainEnt 只有 2-3 个选项,使用查询就是浪费资源。

我能做什么?

【问题讨论】:

  • 您是否尝试同时创建所有 Choice 实体并将它们的键存储在 options 属性中?当然,所有 MainEnt 都会引用共享的一组 Choice 实体。我建议您展示您在 create 工厂中运行的代码,以便我们了解您的实际操作。
  • 如果选择实体的实例归 MainEnt 所有,那么您可以将它们创建为子实体并删除重复的 KeyProperty。
  • create 里面的代码就是我要找的... 可能是这样的:创建 MainEnt 并放置它,然后创建选项并放置它们,然后修改 MainEnt 中的选项属性稍后创建的选项的键。如你所见。我放了 2 次 MainEnt。我正在寻找一个公式来仅向数据存储写入 2 次。
  • 那么选择实例是与所有 MainEnt 实例共享还是独占 MainEnt 的单个实例?
  • 不,选择不共享。每一个都是其 MainEnt 独有的。

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


【解决方案1】:

如果您要每次都获取所有选项,那么只需使用重复的 StructuredProperty

class Choice(ndb.Model):
    name = ndb.StringProperty()

class MainEnt(ndb.Model):
    name = ndb.StringProperty()
    choices = ndb.StructuredProperty(Choice,repeated=True)

    def create(cls, name, choices):
       m = cls.MainEnt(name=name)
       m.choices = [Choice(name=name) for name in choices]
       m.put()

【讨论】:

  • 好的,这个问题可能不是这个问题的一部分,但是每次我访问一个选项的属性时,我都会对数据存储执行一次获取操作?
  • 嗯?使用 StructuredProperty 意味着当您获取 MainEnt 时,您已经拥有所有选择(它们不是单独存储在实体中),如果不获取 MainEnt,您将无法访问它们。
  • 我建议您阅读有关结构化属性的文档developers.google.com/appengine/docs/python/ndb/…
  • 这可能是答案,尽管它完全改变了我的模型结构。谢谢!
  • 您尝试做的事情效率很低,您有没有权衡费用的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多