0

我想得到类似的结果:

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可能会完成这项工作,但会很丑陋。

我相信开始我的帖子的两行简单的行可以以简单的方式动态实现......我一定错过了一些明显的解决方案。

4

1 回答 1

0

据我所知,你不能做这样的事情。这里有一些问题,db.WhateverProperty()被设计为在上,而不是在实例上。就像常规属性一样,当它们附加到实例而不是类时,它们没有太多意义。我认为您最好的选择是使用ast.literal_evaljson.loadsStringProperty内容上并将错误作为字符串处理。

或者,您可以在模型上有 2 个属性/属性,然后您可以编写访问方法,这些方法根据类型委托给适当的方法。

如果您不反对使用ndb.Model,您也许可以侥幸逃脱ndb.JsonProperty- 但我不确定如何将其编入索引以用于查询。

于 2013-10-14T03:26:13.270 回答