【问题标题】:Is it possible to dynamically name attributes in an App Engine Model?是否可以在 App Engine 模型中动态命名属性?
【发布时间】:2010-11-23 03:46:20
【问题描述】:

setattr 允许您在 Python 类中动态命名属性。我正在尝试使用 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,但我并不完全理解语法的意义。

有没有人做到这一点,或者有没有人对句法差异有任何见解?

【问题讨论】:

  • 你真的需要一个动态添加的属性类,还是你正在寻找的带有 setattr 的扩展?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    【解决方案3】:

    不确定,但这可能可行:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2015-03-06
      • 1970-01-01
      • 2012-02-12
      • 2011-06-25
      • 2011-10-08
      相关资源
      最近更新 更多