是否可以在App Engine模型中动态命名属性?

时间:2010-11-23 03:46:20

标签: google-app-engine dynamic setattribute setattr listproperty

setattr允许您在Py​​thon类中动态命名属性。我正在尝试使用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'

我怀疑这是因为prop1是在模型而不是self.prop1中声明的,但我并不完全理解语法的重要性。

有没有人完成这项工作,或者有没有人对语法差异有任何见解?

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找db.Expando课程(而不是db.Model)。

答案 1 :(得分:1)

答案 2 :(得分: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