假设ndb.Model
看起来像这样:
class Foo(ndb.Model):
bar = ndb.StringProperty()
我的问题是,如果我的唯一输入是Foo.query()
,我怎样才能将模型作为此查询所属的对象?
def query_to_model(query):
# some magic
return model
Foo.query().kind
将模型的名称作为字符串返回,但我没有找到将其作为对象的方法。
以下使用eval
工作,但仅在同一文件中定义模型时才使用
def query_to_model(query):
return eval(query.kind)
我想要比这更通用的东西。
答案 0 :(得分:8)
使用此模型定义导入代码后,列表ndb.Model._kind_map
应包含该代码。这是魔术:
def query_to_model(query):
return ndb.Model._kind_map[query.name]
答案 1 :(得分:2)
如果您有类型名称,我会使用此代码查找模型类:
model_module = KIND_MODULES(kind_name)
mod = __import__(model_module, globals(), locals(), [kind_name], -1)
model_class = getattr(mod, kind_name)
KIND模块dict包含从以下位置导入模型的模块:
KIND_MODULES = { 'Users' : 'models', 'Comments' : 'models', 'Cities' : 'examples.models' }