¿Cómo puedo obtener el ndb.Model cuando mi única entrada es un ndb.Query?

Digamos que hay ndb.Model que se ve así:

 class Foo(ndb.Model): bar = ndb.StringProperty() 

Mi pregunta es, si mi única entrada es Foo.query() ¿cómo puedo obtener el modelo como un objeto al que pertenece esta consulta?

 def query_to_model(query): # some magic return model 

El tipo Foo.query().kind el nombre del modelo como una cadena, pero no pude encontrar una manera de obtenerlo como un objeto.

Los siguientes trabajos usan eval , pero solo cuando el modelo está definido en el mismo archivo:

 def query_to_model(query): return eval(query.kind) 

Quiero algo más general que eso.

Una vez que haya importado el código con esta definición de modelo, la lista ndb.Model._kind_map debería contenerlo. Aquí está la magia:

 def query_to_model(query): return ndb.Model._kind_map[query.name] 

Utilizo este código para encontrar la clase de modelo si tiene el nombre de clase:

 model_module = KIND_MODULES(kind_name) mod = __import__(model_module, globals(), locals(), [kind_name], -1) model_class = getattr(mod, kind_name) 

El módulo KIND Modules contiene los módulos para importar los modelos desde:

 KIND_MODULES = { 'Users' : 'models', 'Comments' : 'models', 'Cities' : 'examples.models' }