2013-05-11 42 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

相关问题