如何选择带字符串的ndb属性?

时间:2013-05-11 21:55:41

标签: python google-app-engine app-engine-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'对象不支持项目分配

有没有办法在没有明确定义每个属性的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

python有setattr,它会做你想要的。在你的循环中:

setattr(newM, p, choice(list)

答案 1 :(得分: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是内置类型,您不应为其指定值。