アプリエンジンモデルで属性を動的に名前を付けることは可能ですか?
-
27-09-2019 - |
質問
setattr
Pythonクラスで属性を動的に名前を付けることができます。私はアプリエンジンモデルで同様のことをしようとしています:
class MyModel(db.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
# Doesn't fully work
setatr(self, 'prop1', db.ListProperty(db.Key))
setatr(self, 'prop2', db.StringListProperty())
# Works fully
# prop1 = db.ListProperty(db.Key))
# prop2 = db.StringListProperty())
このコードはコンパイルされますが、電話するとき model.prop1.append(key)
後で、このエラーが発生します。
AttributeError: 'ListProperty' object has no attribute 'append'
私はこれがだと思う prop1
ではなくモデルで宣言されています self.prop1
, 、しかし、私は構文の重要性を完全には理解していません。
誰かがこれを成し遂げたことがありますか、それとも構文の違いについて洞察を持っている人はいますか?
解決
他のヒント
あなたが探していると思います db.Expando
クラス(の代わりに db.Model
).
確かではありませんが、これはうまくいくでしょうか:
class MyModel(db.Model):
@classmethod
def new(cls, *args, **kwargs):
setattr(cls, 'props1', db.ListProperty(db.Key))
setattr(cls, 'props2', db.StringListProperty())
mymodel = cls(*args, **kwargs)
delattr(cls, 'props1')
delattr(cls, 'props2')
return mymodel
所属していません StackOverflow