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,您就无法获取这些选择。我建议您阅读有关结构化属性的文档,这可能是答案,尽管它完全改变了我的模型结构。谢谢您试图做的是非常低效的,您是否有一个权衡费用的用例。