3

我在 google app engine 和 python 上使用 NDB 时遇到了这个错误:Cannot repeat StructuredProperty None that has repeating properties of its own。

它是“无”,因为我在创建新的空字符的过程中遇到错误,因此我可以在创建后填写属性。

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

与史蒂夫霍夫曼一起在 Udacity 的 cs253 上的第 5 周左右,似乎我知道足够危险,所以我想我会确认这是问题所在,并希望能得到一个更好的解决方案来实现我的目标。

基本上,我正在制作一个类似于龙与地下城的角色管理系统,该系统具有一些 GM/玩家实时消息传递和角色表更新功能,我认为这些功能将对越来越多的 google+ 环聊 RPG 玩家有用。我有一份武器、物品、诅咒和魔法效果的清单,它们都是单独的实体,所以我可以随意混合和匹配它们。

武器和物品可以有任意数量的诅咒或良好的魔法效果。角色可以拥有任意数量的武器,yadda yadda。起初,我认为存储实体键列表是可行的方法。然后我想我必须单独从数据库中获取每种武器,每种武器的每个诅咒……这似乎是一种低效的方法。

另外,玩家和 GM 喜欢定制东西,而这并不适合。所以,它击中了我,我可以在一个表中列出标准的东西,并且,当你将它“添加”到一个角色时,它会以重复的结构化属性专门复制到该角色,你可以自定义地狱了在不影响其他任何人的情况下,或者无需我做任何额外的工作。

但它不起作用,所以我认为这是不允许的,因为很可能,列表中的列表中的列表永远不会结束,这可能会导致。有什么更好的方法?

4

2 回答 2

6

结构化属性 的文档清楚地指出:

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

于 2012-08-15T14:14:39.650 回答
3

为我的新手们回答我自己的问题。简短的回答 - 使用 LocalStructureProperty。我的理论是,在嵌套列表上创建索引(Google 会自动执行)会很愚蠢。文档并没有真正指定这一点,至少从我的读数来看,或者它可能而且我只是没有足够的知识来“理解它”。但是,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()

我得到了上面提到的错误:Cannot repeat StructuredProperty None that has repeating properties of its own。

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

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

WeaponList = ListProperty(WeaponModel.Weapon) //你必须在这里传递一个数据类型,这样它就知道它将存储什么

结果 Listproperty 只允许已知数据存储类型(键、字符串、整数)的列表 - 所以存储我的模型实体是行不通的。不过,存储密钥列表会。

武器列表 = 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 之间唯一的书面区别是缺少索引,这似乎没有帮助,但我想我还是会试一试 - 它工作正常。好吧,我没有出错,我可以根据需要检索实体——谁知道前方潜伏着什么危险。

希望这将为一些盲人指明正确的方向。

于 2012-05-21T19:31:56.413 回答