是否存在通用方法从字符串中设置数据存储区实体实例中的属性,以便它根据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相对较新,无法通过文档找到。)
感谢您的帮助。
答案 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)