Python Inspect - поиск типа данных для свойства в классе GAE db.model
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/> --" + subitem)
Выше приведен список имен свойств для переменной "item". Моя идея item.__dict__
не работал, потому что item
был str
, Как я могу затем отобразить тип поля данных для каждого свойства, например, db.FloatProperty()
за имущество называется timezone
?
GAE = Google App Engine - но я уверен, что тот же ответ будет работать для любого класса.
Спасибо, Нил Уолтерс
3 ответа
Повторите, используя "для имени, свойства в Employee.properties(). Items()". Аргументом свойства является экземпляр Property, который можно сравнить с помощью instanceof.
Для таких задач интерактивная оболочка 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
сопоставление имен свойств модели с фактическими объектами свойств, которые они представляют.
Я добавляю ту же проблему, и первые 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"
}