1

setattrでは、Pythonクラスの属性に動的に名前を付けることができます。私は、App Engineのモデルと似た何かをやろうとしている:App Engineモデルの属性に動的に名前を付けることはできますか?

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' 

私はこれがあるためである疑いがありますself.prop1の代わりにprop1がモデルで宣言されていますが、構文の重要性は十分に理解されていません。

誰でもこれを達成しましたか、誰でも構文上の違いについて洞察していますか?

+0

は、あなたが実際にあなたが探しているものを動的に追加プロパティクラスを必要とする、またはSETATTRとはExpandoありますか? –

答えて

5

db.Modelの代わりにdb.Expandoクラスを探していると思います。

1

わからないが、この作品は多分になります。

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 
関連する問題