Python Inspect - 查找GAE db.model类中属性的数据类型
class Employee(db.Model):
firstname = db.StringProperty()
lastname = db.StringProperty()
address1 = db.StringProperty()
timezone = db.FloatProperty() #might be -3.5 (can contain fractions)
class TestClassAttributes(webapp.RequestHandler):
"""
Enumerate attributes of a db.Model class
"""
def get(self):
for item in Employee.properties():
self.response.out.write("<br/>" + item)
#for subitem in item.__dict__:
# self.response.out.write("<br/> --" + subitem)
上面的内容会给我一个名为“item”的变量的属性名称列表。
我之前想用 item.__dict__
来查看,但因为 item
是一个 str
类型,所以没成功。
那么,我该如何显示每个属性的数据字段类型呢?比如,像 db.FloatProperty()
这样的类型,用于名为 timezone
的属性?
GAE 是谷歌应用引擎(Google App Engine)的缩写,但我相信这个方法对任何类都适用。
谢谢, Neal Walters
3 个回答
0
我遇到了同样的问题,前两个回答对我没有完全帮助。
我无法从类的元数据或实例属性中获取类型信息,这真让人困惑。所以我只好使用字典。
GetType()这个方法会以字符串的形式返回属性的类型。
这是我的回答:
class RFolder(db.Model):
def GetPropertyTypeInstance(self, pname):
for name, property in self.properties().items():
if name==pname:
return property
return None
def GetType(self, pname):
t = self.GetPropertyTypeInstance(pname)
return RFolder.__DB_PROPERTY_INFO[type(t)]
__DB_PROPERTY_INFO = {
db.StringProperty :"String",
db.ByteStringProperty :"ByteString",
db.BooleanProperty :"Boolean",
db.IntegerProperty :"Integer",
db.FloatProperty :"Float",
db.DateTimeProperty :"DateTime",
db.DateProperty :"Date",
db.TimeProperty :"Time",
db.ListProperty :"List",
db.StringListProperty :"StringList",
db.ReferenceProperty :"Reference",
db.SelfReferenceProperty :"SelfReference",
db.UserProperty :"User",
db.BlobProperty :"Blob",
db.TextProperty :"Text",
db.CategoryProperty :"Category",
db.LinkProperty :"Link",
db.EmailProperty :"Email",
db.GeoPtProperty :"GeoPt",
db.IMProperty :"IM",
db.PhoneNumberProperty :"PhoneNumber",
db.PostalAddressProperty :"PostalAddress",
db.RatingProperty :"Rating"
}
1
对于这种问题,交互式的Python命令行非常有用。如果你用它来探索一下你的Employee对象,可能通过反复尝试就能找到你问题的答案。
比如说:
>>> from groups.models import Group
>>> Group.properties()
{'avatar': <google.appengine.ext.db.StringProperty object at 0x19f73b0>,
'created_at': <google.appengine.ext.db.DateTimeProperty object at 0x19f7330>,
'description': <google.appengine.ext.db.TextProperty object at 0x19f7210>,
'group_type': <google.appengine.ext.db.StringProperty object at 0x19f73d0>}
从中你可以知道,db.Model
对象的properties()
方法会返回一个dict
,这个字典把模型的属性名称和它们实际代表的属性对象对应起来。
2
使用“for name, property in Employee.properties().items()”来进行循环。这里的property参数是一个属性实例,你可以用instanceof来进行比较。