質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top