Python Inspect - поиск типа данных для свойства в классе GAE db.model - PullRequest
1 голос
/ 17 сентября 2009
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 - но я уверен, что тот же ответ будет работать для любого класса.

Спасибо, Нил Уолтерс

Ответы [ 3 ]

2 голосов
/ 18 сентября 2009

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

1 голос
/ 18 сентября 2009

Для таких задач интерактивная оболочка 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 голосов
/ 22 ноября 2010

Я добавляю ту же проблему, и первые 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"
    }
...