使用这样的数据模型
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'对象不支持项目分配
有没有办法在没有明确定义每个属性的情况下执行此操作?
答案 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
是内置类型,您不应为其指定值。