我幾天前對另一個用例有同樣的問題。爲了解決這個問題,我創建了一個屬性類型列表,來完成我需要的轉換。此解決方案使用未記錄的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))
UPDATE:
沒有文檔: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)
這是有趣/有用的功能,從名稱(db.class_for_kind)建立一個實體實例...我的問題是稍有不同(對不起,如果不是理解你的答案)。我很有興趣從字符串內部化屬性(屬性字段) - 就像我在我的問題中提到的那樣。我希望總是傳遞一個字符串並讓函數根據屬性類型轉換爲python基本類型(所以如果它是一個IntegerProperty,那麼它將執行一個int(strArg),然後在該propery中執行一個setattr() ..(謝謝) – user1055761
生成的字典爲每個屬性名稱提供了一個Model屬性的數據類型。我的用例:在兩個GAE域之間交換模型(所有實體)和/或壓縮模型實體的函數。該函數用於轉換數據類型,如BlobReferenceProperty,BlobProperty和LinkProperty(帶有get_serving_url)。在您的用例中,您可以將字符串轉換爲屬性,其中轉換由結果模型(Person)中屬性的數據類型控制。 – voscausa