ndb gae重复KeyPropery和事务

时间:2014-05-20 11:06:33

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

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

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,因此该选项不起作用。

我不想使用跨群组交易,也不想两次保存主要实体。

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

我该怎么办?

1 个答案:

答案 0 :(得分:2)

如果您要每次都获取所有选择,那么只需使用重复的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()