Appengine Datastore Propery fromString()方法

时间:2012-12-31 15:12:22

标签: python google-app-engine

是否存在通用方法从字符串中设置数据存储区实体实例中的属性,以便它根据Property类型执行基础转换。

person = Person ()
person.setattr("age", "26") # age is an IntegerProperty
person.setattr("dob", "1-Jan-2012",[format]) # dob is a Date Property

这很容易编写,但这是一个非常常见的用例,并且想知道Datastore Python API是否有任何规定。

(对不起,如果这是一个行人问题,我对Appengine相对较新,无法通过文档找到。)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我几天前有另一个用例的相同问题。为了解决这个问题,我创建了一个属性类型列表,以进行我需要的转换。此解决方案使用未记录的db函数和db.Model类的内部。也许有更好的解决方案。

from google.appengine.ext import db
kind = 'Person'
models_module = { 'Person' : 'models'}       # module to import the model kind from

model_data_types = {}                        # create a dict of properties, like DateTimeProperty, IntegerProperty
__import__(models_module[kind], globals(), locals(), [kind], -1) 
model_class = db.class_for_kind(kind)        # not documented
for key in model_class._properties :         # the internals of the model_class object
    model_data_types[key] = model_class._properties[key].__class__.__name__

要转换字符串,您可以创建一个包含字符串转换函数的类,如:

class StringConversions(object)

    def IntegerProperty(self, astring):

        return int(astring)     

    def DateTimeProperty(self, astring):

        # do the conversion here
        return ....

并使用它:

property_name = 'age'
astring = '26'

setattr(Person, property_name, getattr(StringConversions,  model_data_types[property_name] )(astring) ) 

<强>更新

没有以下文档:db.class_for_kind(kind) 但是有更好的解决方案。替换这两行:

__import__(models_module[kind], globals(), locals(), [kind], -1) 
model_class = db.class_for_kind(kind)        # not documented

使用:

module = __import__(models_module[kind], globals(), locals(), [kind], -1) 
model_class = getattr(module, kind)