2013-05-11 45 views
2

有了這樣如何用字符串選擇一個ndb屬性?

class M(ndb.Model): 
    p1 = ndb.StringProperty() 
    p2 = ndb.StringProperty() 
    p3 = ndb.StringProperty() 

我試圖用一個循環是這樣的

list = ["a","b","c", "d"] 
newM = M(id = "1234") 
for p in ['p1','p2','p3']: 
    newM[p] = choice(list) 
newM.put() 

設置的屬性值的數據模型,但我得到一個錯誤

錯誤「 M'對象不支持項目分配

有沒有明確定義每個屬性的方法?

回答

3

python有setattr這將做你想做的。裏面你的循環:

setattr(newM, p, choice(list) 
1

P1,P2,P3被定義爲模型的屬性,機型不支持setitem或訪問的GetItem(即模型沒有表現得像一個字典)。正如另一個答案建議使用setattr,這將工作。但偶爾會導致問題,這取決於你嘗試的setattr類型。另一選擇是使用_set_value它看起來像

for prop in M._properties.values(): 
    prop._set_value(newM,choice(list) 

,或者如果你只想要的特定屬性,而不是全部。

clist= ["a","b","c", "d"] 
newM = M(id = "1234") 
for p in ['p1','p2','p3']: 
    M._properties[p]._set_value(newM,choice(clist)) 
newM.put() 

別的東西要考慮,list是一個內置的類型,你不應該賦值給它。

+0

您建議在某些情況下可能會失敗,具體取決於屬性類型。你可以給一些指點或詳細說明嗎? – gsinha 2015-03-07 20:07:31

+0

遇到特定問題時,有人在/ /或SO,但現在找不到它。這是從內存中的db或ndb奇怪的角落情況。 – 2015-03-08 11:15:17

+0

感謝您的更新。我用NDB填充()來達到類似的目的。 – gsinha 2015-03-08 13:01:30

相關問題