1

setattrPythonクラスの属性に動的に名前を付けることができます。AppEngineモデルで同様のことをしようとしています。

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だと思いますが、構文の重要性を完全には理解していません。

誰かがこれを達成しましたか、または誰かが構文の違いについて何か洞察を持っていますか?

4

3 に答える 3

5

db.Expando(ではなく)クラスを探していると思いますdb.Model

于 2010-11-23T04:00:20.537 に答える
1

このSOの質問:

あなたがやりたいことの例を示します。

于 2010-11-23T04:07:58.007 に答える
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
于 2011-01-31T01:40:23.140 に答える