2009-09-17 1 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.__dict__ не сработала, потому что item был str. Как я могу отобразить тип поля данных для каждого свойства, например db.FloatProperty() для объекта, называемого timezone?Python Inspect - поиск типа данных для свойства в GAE db.model Класс

GAE = Google App Engine - но я уверен, что тот же ответ будет работать для любого класса.

Спасибо, Нил Walters

ответ

2

итерация с использованием "для имени, недвижимость в Employee.properties(). Пункты()". Аргумент property - это экземпляр Property, который вы можете сравнить с помощью instanceof.

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

С, что вы знаете, что properties() метод в db.Model объекта возвращает dict отображение имен свойств в модели к реальным объектам собственности, которые они представляют.

+0

Я считаю, что это то, что я показал в моем вопросе, то я итерация свойства(). Я ищу, как добраться до типа данных. Думаю, я мог бы выяснить что-нибудь с проб и ошибок - таким образом, использование StackOverflow позволит сэкономить время. – NealWalters

+0

Я предполагаю, что я просто пытался указать, что переход в интерактивную оболочку, возможно, указал вам в правильном направлении, показывая вам, что метод properties() возвращает словарь, который вы, как мне кажется, хотите итерации (используя .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" 
    }