GAE使用嵌套的重复结构化属性重复结构化属性

时间:2012-05-21 03:34:17

标签: google-app-engine

我一直在谷歌应用引擎和python上使用NDB收到此错误:无法重复结构属性没有重复属性的。

这是“无”,因为我在创建一个新的空字符的过程中得到错误,所以我可以在创建后填写属性。

我猜它不喜欢我希望我的实体“Character”拥有一个重复和结构化的属性“weaponList”,其中包含另一个实体“Weapon”,它还包含一个重复的,结构化的属性包含和实体“诅咒”。

在Udacity与Steve Huffman一起参加第5周左右的训练,似乎我知道这很危险,所以我想我确认这是问题所在,希望能找到更好的解决方案来实现我的目标

基本上,我正在创建一个龙与地下城角色管理系统,它具有一些GM /播放器实时消息和角色表更新功能,我认为这些功能可用于越来越多的谷歌+环聊RPG播放器。我有一个武器,物品,诅咒和魔法效果列表作为单独的实体,所以我可以随意混合和匹配它们。

武器和物品可以拥有任意数量的诅咒或神奇的效果。人物可以拥有任意数量的武器,yadda yadda。起初,我认为存储实体密钥列表将是最佳选择。然后我想我必须从数据库中单独获取每个武器,每个武器的每个诅咒......这似乎是一种效率低下的方法。

另外,玩家和总经理都喜欢定制东西,但这并不适合。所以,它打击了我,我可以在一个表中有一个标准的东西列表,当你将它“添加”到一个字符时,它会被重复的结构化属性专门复制到该字符,你可以自定义地狱它不会影响其他任何人,或者没有我做任何额外的工作。

但是它不起作用,所以我认为这是不允许的,因为列表中的列表可能会导致非常可能的,永无止境的列表。什么是更好的方式?

2 个答案:

答案 0 :(得分:6)

结构化属性的documentation清楚地表明:

  

虽然可以重复StructuredProperty并且StructuredProperty可以包含另一个StructuredProperty,但要注意:如果一个structred属性包含另一个,则只能重复其中一个。解决方法是使用LocalStructuredProperty,它没有此约束(但不允许查询其属性值)。

答案 1 :(得分:3)

为我的同胞们回答我自己的问题。简短回答 - 使用LocalStructureProperty。我的理论是,在嵌套列表上创建索引(谷歌自动执行)将是愚蠢的。文档并没有真正指定这一点,至少从我的读数来看,或者它可能和我只是不知道“得到它”。但是,LocalStructuredProperties不会创建索引,我的设置现在工作正常。如果您需要列表格式的数据库对象的本地副本(不是引用) - 也有本地列表作为属性 - localStructuredProperty可能就是您所需要的。

我想更详细地介绍一下这个,以及我尝试使用标准数据存储区的几个选项,以及NDB json属性数据类型

在我的模型类看起来像这样之前

class Character(ndb.Model):
    name = stringProperty()
    weaponList = StructuredProperty(WeaponModel.Weapon, repeated=True)

class WeaponModel(ndb.Model):
    name = stringProperty()
    curseList = StructuredProperty(BufferModel.Curse, repeated=True)

class BufferModel(ndb.Model):
    name = stringProperty()

我找回了上面提到的错误:不能重复结构属性没有重复属性的。

我决定对可能的解决方案进行调查。

1)我切换到基本数据存储区db(不是ndb)并将所有内容更改为List属性

weaponList = ListProperty(WeaponModel.Weapon)//你必须在这里传递数据类型,以便它知道它将存储什么

原来,Listproperty只允许已知数据存储类型(键,字符串,整数)的列表 - 因此存储我的模型实体是行不通的。但是存储密钥列表。

weaponList = ListProperty(db.key)

它充分发挥作用。为了允许用户编辑或创建自己的武器,我可以在武器上添加创建者属性,然后根据该或其他参考进行查询,如公共或私人。

真的不喜欢这个想法。无论出于什么原因,意大利面怪物的异象一直在我脑海中浮现,所以我想 - 这个NDB中的这个json对象呢?

构建该东西的大部分伪代码版本如下:

aCurse = getcurse
aJsonCurse = json.dump(aCurse)
aWeapon = getWeapon(curseList=[aJsonCurse])
aJsonWeapon = json.dump(aWeapon)


aCharacter.weaponList = [aJsonWeapon]

但它不那么容易。武器有json对象之前它本身被倾倒到json,所以用嵌套的json倾倒武器不是很好。我通过不同的方式来解决这个问题,但意大利面条的怪物来了笑,所以我停下来去吃午饭。

当我回来时,我想我会再次查看文档。结构化和LocalStructured之间唯一的书面差异是缺乏索引,这似乎没有帮助,但我想我还是试一试 - 它运行正常。好吧,我没有错误,我可以根据需要检索实体 - 谁知道潜伏着哪些危险。

希望这会让一些盲人走向正确的方向。