Google app engine 如何确定模型类是db还是ndb

Google app engine 如何确定模型类是db还是ndb,google-app-engine,google-cloud-datastore,app-engine-ndb,Google App Engine,Google Cloud Datastore,App Engine Ndb,我创建了一个实用程序来交换或压缩所有实体。但是,我如何才能确定所使用的model_类是db.model还是ndb.model def _encode_entity(self, entity): if self.ndb : entity_dict = entity.to_dict()

我创建了一个实用程序来交换或压缩所有实体。但是,我如何才能确定所使用的model_类是db.model还是ndb.model

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
更新:我使用的解决方案。另见Guido的回答

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)

您可以使用仅存在于ndb中的属性,或者使用其他方式

例如,作为ndb实体属性的“has\u repeated”或“pre\u get\u hook”。 所以你可以做:

self.ndb = hasattr(self, '_has_repeated')

您可以使用仅存在于ndb中的属性,或者使用其他方式

例如,作为ndb实体属性的“has\u repeated”或“pre\u get\u hook”。 所以你可以做:

self.ndb = hasattr(self, '_has_repeated')

如何导入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.

如何导入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.

是的,这个有效。我已经试过了,但很快就放弃了。使用“pre\u get\u hook”带来了不同。谢谢你的回答。它很好用。如果没有更好的答案,我会接受的。我在等待,因为_has _repeated没有作为属性记录。我将使用guidos回答。。。我不知道为什么我没有想到这一点。这是一个记录在案的答案。谢谢你的帮助。是的,这很有效。我已经试过了,但很快就放弃了。使用“pre\u get\u hook”带来了不同。谢谢你的回答。它很好用。如果没有更好的答案,我会接受的。我在等待,因为_has _repeated没有作为属性记录。我将使用guidos回答。。。我不知道为什么我没有想到这一点。这是一个记录在案的答案。谢谢你的帮助。