如何选择带字符串的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'对象不支持项目分配


没有显式定义每个属性,有没有办法做到这一点?


繁花如伊
浏览 185回答 2
2回答

暮色呼如

python有setattr可以做你想要的。在循环内:setattr(newM, p, choice(list)

蝴蝶刀刀

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是内置类型,您不应为其分配值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python