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

时间:2009-09-17 19:48:21

标签: python google-app-engine reflection inspection

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__的看法不起作用,因为itemstr。 然后,我如何显示每个属性的数据字段类型,例如db.FloatProperty()为名为timezone的属性?

GAE = Google App Engine - 但我确信相同的答案适用于任何课程。

谢谢, 尼尔沃尔特斯

3 个答案:

答案 0 :(得分:2)

使用“for Employee.properties()。items()”中的名称,属性进行迭代。 property参数是Property实例,您可以使用instanceof。

进行比较

答案 1 :(得分:1)

对于像这样的问题,交互式Python shell非常方便。如果您使用它来搜索您的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>}

由此您知道properties()对象的db.Model方法返回dict将模型的属性名称映射到它们所代表的实际属性对象。

答案 2 :(得分:0)

我添加了同样的问题,前2个答案对我没有帮助。 我无法从类的元数据中获取类型信息 实例属性,这是奇怪的。所以我不得不使用字典。

方法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"
    }