【发布时间】: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