Как узнать, является ли образцовый класс db или ndb

Я создал полезность для обмена или почтового индекса все предприятия для вида. Но как я могу узнать, является ли используемый model_class db. Модель или ndb. Модель?

def _encode_entity(self, entity):                                             

    if self.ndb :
        entity_dict = entity.to_dict()                                                     
        self.entity_eid = entity.key.id()
        entity_dict['NDB'] = True
    else :
        entity_dict = db.to_dict(entity)
        self.entity_eid = entity.key().name()
        entity_dict['NDB'] = False

    ....

Теперь я использую:

def queryKind(self):

    try :
        self.query = self.model_class.query()
        self.ndb = True
    except AttributeError :
        self.query = self.model_class.all()
        self.ndb = False
    return self.make(self._encode_entity)       # make a zip or a page

UPDATE : The solution I have used. See also Guido's answer

self.kind = 'Greeting'
module = __import__('models', globals(), locals(), [self.kind], -1)
self.model_class = getattr(module, self.kind)
entity = self.model_class()

if isinstance(entity, ndb.Model): 
    self.ndb = True
    self.query = self.model_class.query()
elif isinstance(entity, db.Model): 
    self.ndb = False
    self.query = self.model_class.all()
else :
    raise ValueError('Failed to classify entities of kind : ' + self.kind)
1
nl ja de

2 ответы

вы могли использовать признак, который действительно существует только в ndb или наоборот.

например _has_repeated или _pre_get_hook , которые являются свойствами ndb предприятия.
таким образом, вы могли сделать:

self.ndb = hasattr(self, '_has_repeated')
5
добавлено
таким образом, вы могли бы хотеть принять этот ответ;)
добавлено автор aschmid00, источник
я пошел бы с ответом guidos... don' t знают почему я didn' t думают об этом.
добавлено автор aschmid00, источник
Да, это работает. Я уже попробовал что-то как этот, но я дал до скоро. Используя _pre_get_hook имел значение.
добавлено автор voscausa, источник
Спасибо за ваш ответ. Это хорошо работает. Если я не получу лучший ответ, то я приму его. Я жду, потому что "_has_repeated" не зарегистрирован как собственность.
добавлено автор voscausa, источник
Это - зарегистрированный ответ. Спасибо за вашу помощь.
добавлено автор voscausa, источник

Как насчет импорта ndb и db, и проверяющий на предприятие, являющееся случаем их соответствующих Образцовых классов?

if isinstance(entity, ndb.Model):
    # Do it the NDB way.
elif isinstance(entity, db.Model):
    # Do it the db way.
else:
    # Fail.  Not an entity.
5
добавлено
Спасибо Гидо, это хорошо работает. Я обновил свой вопрос.
добавлено автор voscausa, источник
Google Cloud Platform_ru
Google Cloud Platform_ru
49 участник(ов)

Русскоязычное обсуждение google_cloud_pladform