Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine ndb gae重复密钥属性和事务_Google App Engine_Transactions_Google Cloud Datastore - Fatal编程技术网

Google app engine ndb gae重复密钥属性和事务

Google app engine ndb gae重复密钥属性和事务,google-app-engine,transactions,google-cloud-datastore,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(nd

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

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()
这里我有一个主要实体,它有一些选择的列表。 要创建主实体,我需要使用事务一致地创建主实体和选择实体。如果某些操作失败,我希望所有操作都失败

问题是,要在事务内部运行,所有事务都需要位于同一个实体组中,但我不能这样做,因为我不知道主实体的键,无法将其指定为每个选项的父参数。我不能在事务中使用分配ID,因此此选项不起作用

我不想使用跨组事务,也不想将主实体保存两次

此外,我还考虑使用查询来获取选项,并且不使用repeated属性,但只要每次维护通常只有2-3个选项,使用查询就是浪费资源


我能做什么?

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

是否尝试同时创建所有选项实体并将其键存储在choices属性中?当然,所有的MainEnt都会提到共享的选择实体集。我建议您显示您在
create
工厂中运行的代码,以便我们了解您的真正意图。如果choice实体的实例由MainEnt所有,则您可以将它们作为子对象创建,并删除repeated KeyProperty。create中的代码就是我要查找的。。。可能是这样的:创建并放置MainEnt,然后创建并放置选项,然后使用稍后创建的选项的键修改MainEnt中的choices属性。如你所见。我放了两次保养液。我正在寻找一个公式,以便只将此写入数据存储2次。那么选项的实例是与所有MainEnt实例共享还是仅与单个MainEnt实例共享?不,选项不共享。每一个都是唯一的。好吧,这个问题可能不是这个问题的一部分,但是每次我访问一个选择的属性时,我都会执行一次访问数据存储的操作?嗯?使用StructuredProperty意味着,当您获取一个MainEnt时,您已经拥有了所有的选择(它们存储在实体中,而不是单独存储),如果不获取MainEnt,您就无法获取这些选择。我建议您阅读有关结构化属性的文档,这可能是答案,尽管它完全改变了我的模型结构。谢谢您试图做的是非常低效的,您是否有一个权衡费用的用例。