2012-05-21 105 views
3

我一直在谷歌應用程序引擎和python上使用NDB獲取此錯誤:不能重複StructuredProperty無重複屬性自己。GAE重複結構化屬性與嵌套重複結構化屬性

這是「無」,因爲我在創建一個新的空字符的過程中遇到錯誤,所以我可以在創建後填寫屬性。

我猜它不喜歡我希望我的實體「角色」有一個屬性「武器列表」,它是重複和結構化的,包含另一個實體「武器」,它也具有重複的結構化屬性,包含和實體「詛咒」。

我在Udacity的cs253與史蒂夫霍夫曼的第5周左右,似乎我知道剛剛夠危險,所以我想我會確認這是問題,並希望得到一個更好的解決方案,實現我的目標。

基本上,我製作了一個龍與地下城人物角色管理系統,它有一些通用/玩家實時消息和角色表更新功能,我認爲這些功能可以用於越來越多的谷歌+環聊RPG玩家。我有一個武器,物品,詛咒和魔法效果的清單,都是獨立的實體,所以我可以隨意混合和匹配它們。

武器和物品可以有任何數量的詛咒或好的魔法效果。角色可以有任意數量的武器,yadda yadda。起初,我認爲存儲一個實體鍵列表將是一條路。然後,我想我必須從數據庫中單獨獲取每件武器,並且每種武器都受到詛咒......這似乎是一種效率低下的方式。

此外,玩家和通用汽車都喜歡定製事物,但這不適用於此。所以,它打擊了我,我可以在一張表中列出標準東西,並且當你將它「添加」到一個角色時,它會被專門複製到重複結構化屬性中的那個角色,並且你可以自定義它不會影響其他任何人,或者沒有我做任何額外的工作。

但它不工作,所以我認爲這是不允許的,因爲列表中可能會導致列表中可能的,永不結束的列表。更好的方法是什麼?

回答

3

回答我自己的問題,我的同胞newbs。簡短的回答 - 使用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() 

我找回了上面提到的錯誤:無法重複StructuredProperty無重複屬性的屬性。

我決定做一個可能的解決方案的調查。

1)我切換到基本數據存儲DB(未NDB),並改變了一切的列表屬性

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之間唯一的區別在於缺乏索引,這似乎沒有幫助,但我想我會放棄它 - 並且它工作正常。好吧,我不會出錯,我可以根據需要檢索實體 - 誰知道潛在的危險。

希望這會指出一些盲人正確的方向。

6

documentation結構化性質明確規定:

雖然StructuredProperty可重複和StructuredProperty可以包含另一個StructuredProperty,請注意:如果一個structred屬性包含另一種,但其中只有一個可以重複。解決方法是使用LocalStructuredProperty,它沒有此約束(但不允許對其屬性值進行查詢)。