1

setattr允许您在Py​​thon类中动态命名属性。我试图做一个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' 

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

有没有人完成过这个任务,或者没有人对语法差异有所了解?

+0

你确实需要一个动态添加的属性类,或者是与SETATTR你在找什么在Expando? – 2010-11-24 04:07:17

回答

5

我认为你正在寻找db.Expando类(而不是db.Model)。

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 
相关问题