我想得到类似的结果:
class MyClass(db.Model):
field=db.IntegerProperty()
即,此类的对象应该field
在其属性列表中:
o=MyClass()
o.properties()
但是,这些字段应根据其名称和类型的定义动态创建,如下例所示:
class MyClass(db.Model):
def __init__(self,*args,**kwargs):
defs={'field':'d','otherfield':'s'} #'d' for integer, 's' for string
for key in defs:
typeof=defs[key]
val=db.StringProperty() if typeof=='s' else db.IntegerProperty()
#tried these lines below... but properties() are still empty :|
setattr(self, key, val)
setattr(self.__class__, key, val)
setattr(self.__class__, key, property(lambda self: self.__dict__[key]))
self.__dict__.update({key:val})
db.Model.__init__(self,*args,**kwargs)
没有setattr
一条线起作用(它们创建字段但不创建属性);对象中的属性列表仍然为空,因此我似乎无法在db.GqlQuery()
. 我不想使用“Expando”模型,因为在我的情况下,字段列表及其类型是已知的并且是恒定的。使用eval
可能会完成这项工作,但会很丑陋。
我相信开始我的帖子的两行简单的行可以以简单的方式动态实现......我一定错过了一些明显的解决方案。