vos*_*usa 1 google-app-engine app-engine-ndb google-cloud-datastore
我创建了一个实用程序来交换或压缩所有实体.但是,如何确定使用的model_class是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
....
Run Code Online (Sandbox Code Playgroud)
现在我使用:
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
Run Code Online (Sandbox Code Playgroud)
更新:我使用的解决方案.另见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)
Run Code Online (Sandbox Code Playgroud)
您可以使用仅存在于ndb
或以其他方式存在的属性.
例如,_has_repeated
或者_pre_get_hook
是ndb
实体的属性.
所以你可以这样做:
self.ndb = hasattr(self, '_has_repeated')
Run Code Online (Sandbox Code Playgroud)
如何导入ndb和db,并测试实体是其各自Model类的实例?
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.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
284 次 |
最近记录: |