[Добавлено решение в конце вопроса]Как получить Типы свойства ОПРСА модели в GAE Python
Как получить Типы свойства ОПРСА модели в GAE Python?
Пример модели:
class X(ndb.Model):
prop_1 = ndb.IntegerProperty ("a", indexed=True)
prop_2 = ndb.StringProperty ("b")
prop_3 = ndb.DateTimeProperty ("c", repeated=True)
prop_4 = ndb.DateProperty ("d", repeated=False)
Использование GAE Metadata API не помогло.
Я могу получить список всех свойств модели X
, используя get_properties_of_kind(kind).
Но get_representations_of_kind(kind) не помогла бы мне получить типы недвижимости, как это имеет то же значение, представительские свойства для более чем одного типа собственности (как DateTime
и Date
оба имеют INT64
).
ПОПЫТКА 1
y = globals()["X"] # IF I GET THE MODEL NAME AS STRING; ELSE y = X.
logging.info (y)
logging.info (vars(y))
for item in vars(y):
if (item[0]!="_"): # ASSUMING ALL INTERNAL KEY NAMES START WITH "_".
logging.info ("item=["+item+"] ")
logging.info ("vars(y)[item]=["+repr (vars(y)[item])+"] ")
ВЫВОД
2015-03-02 00:08:43.166 +0530 I X<prop_1=IntegerProperty('a'), prop_2=StringProperty('b'), prop_3=DateTimeProperty('c', repeated=True)>
2015-03-02 00:08:43.171 +0530 I {'__module__': '__main__', 'prop_1': IntegerProperty('a'), 'prop_2': StringProperty('b'), 'prop_3': DateTimeProperty('c', repeated=True), '_properties': {'a': IntegerProperty('a'), 'c': DateTimeProperty('c', repeated=True), 'b': StringProperty('b')}, '_has_repeated': True, '__doc__': None}
2015-03-02 00:08:43.186 +0530 I item=[prop_1]
2015-03-02 00:08:43.191 +0530 I vars(y)[item]=[IntegerProperty('a')]
2015-03-02 00:08:43.195 +0530 I item=[prop_2]
2015-03-02 00:08:43.200 +0530 I vars(y)[item]=[StringProperty('b')]
2015-03-02 00:08:43.204 +0530 I item=[prop_3]
2015-03-02 00:08:43.209 +0530 I vars(y)[item]=[DateTimeProperty('c', repeated=True)]
Используя этот подход, я хотел бы получить Типы свойство модели как строка (например, DateTimeProperty('c', repeated=True)
). Мне нужно было бы извлечь Property Type (DateTimeProperty
) с помощью regex.
Это правильный (и лучший) способ сделать это?
РЕШЕНИЕ
на основе ответов по @Greg и @Alex Мартелли, я был в состоянии придумать решение:
obj = globals()["X"]
for item in obj._properties:
logging.info ("b item=["+item+"] ")
# This gave the short names of properties : "a", "b", "c", ..
logging.info ("b needed part = ["+obj._properties[item].__class__.__name__+"] ")
# This gave the property type class : "IntegerProperty", "StringProperty", "DateTimeProperty", ..
for item in obj.__dict__:
if (item[0]!="_"):
logging.info ("HB item=["+item+"] ")
# This gave the actual property name : "prop_1", "prop_2", "prop_3", ..
Примечание, что я не мог использовать GAE Metadata API, поскольку она нуждается по крайней мере, одно лицо Модели должно присутствовать, что не обязательно в моем случае.
В моей ситуации мне нужно создать имя класса из строки (следовательно, globals() ..).
Только проблема, теперь, как соотнести фактические имена свойств (например, «prop_1») с полученными свойствами? Прямо сейчас короткие имена (например, «a») сопоставляются с типами свойств.
Пожалуйста, дайте мне знать, если я делаю что-то неправильно.
Спасибо. Я обновил вопрос с помощью решения. Пожалуйста, дайте мне знать ваши взгляды. – gsinha