Python Inspect - 查找GAE db.model类中属性的数据类型

1 投票
3 回答
1237 浏览
提问于 2025-04-15 14:24
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/>&nbsp;&nbsp;--" + 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来进行比较。

撰写回答