2

使用这样的数据模型

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”对象不支持项目分配

有没有办法在不明确定义每个属性的情况下做到这一点?

4

2 回答 2

3

python 有setattr可以做你想做的事。在你的循环内:

setattr(newM, p, choice(list)
于 2013-05-11T21:59:53.093 回答
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的是内置类型,您不应该为它分配值。

于 2013-05-11T23:01:07.903 回答