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 に答える