当我的唯一输入是ndb.Query时,如何获取ndb.Model?

时间:2013-02-01 17:40:49

标签: python google-app-engine app-engine-ndb

假设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)

我想要比这更通用的东西。

2 个答案:

答案 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' }