2009-09-17 81 views
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__沒有工作,因爲itemstr。 我怎樣才能顯示每個屬性的數據字段類型,如db.FloatProperty()timezone屬性?Python檢查 - 查找GAE中屬性的數據類型db.model類

GAE = Google App Engine - 但我確定同樣的答案適用於任何課程。

感謝, 尼爾·沃爾特斯

回答

2

使用迭代 「的名稱,在Employee.properties屬性()。項目()」。屬性參數是Property實例,您可以使用instanceof進行比較。

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>} 

從你知道一個db.Model對象的properties()方法返回一個dict映射模型的屬性名稱到它們所代表的實際屬性的對象。

+0

我相信這是我在我的問題表明,即我是迭代的屬性()。我正在尋找如何獲得數據類型。我想我可以弄清楚試驗和錯誤的任何事情 - 因此使用StackOverflow來節省時間。 – NealWalters

+0

我想我只是想指出,放入交互式shell可能會指出你在正確的方向,通過顯示你的屬性()方法返回一個字典,你會(一般來說,我認爲)想要迭代以不同的方式使用(使用.items()來獲得鍵和值)。它會告訴你,存儲在該字典中的值完全是你正在尋找的值。 –

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