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