1
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 - 但我确信相同的答案适用于任何课程。

谢谢,尼尔沃尔特斯

4

3 回答 3

2

使用“for name, property in Employee.properties().items()”进行迭代。property 参数是 Property 实例,您可以使用 instanceof 进行比较。

于 2009-09-17T21:05:35.837 回答
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模型的属性名称到它们所代表的实际属性对象的映射。

于 2009-09-17T22:14:48.583 回答
0

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

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"
    }
于 2010-11-22T03:10:54.123 回答