query ndb how google engine create app python google-app-engine app-engine-ndb

python - how - ndb put



El método ndb to_dict no incluye la clave del objeto (2)

No te estás perdiendo nada ;-)

Simplemente agregue la clave al diccionario después de llamar a tocdict, y sí anule el método.

Si tiene varios modelos que no comparten la misma clase base con su to_dict personalizado, lo implementaría como mixin.

para definir to_dict como un método de una clase Mixin. lo harías

class ModelUtils(object): def to_dict(self): result = super(ModelUtils,self).to_dict() result[''key''] = self.key.id() #get the key as a string return result

Entonces para usarlo.

class MyModel(ModelUtils,ndb.Model): # some properties etc...

Estoy aprovechando el método to_dict de ndb para convertir las propiedades de un objeto en un dict de python. De todo lo que puedo decir, este método no incluye la clave o el elemento del objeto dentro del dict según la documentación:

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

Sin embargo, para mi situación, necesito la clave para estar en el dict. Mi preferencia sería aprovechar el método incorporado y subclasificarlo o algo similar en lugar de crear mi propio método to_dict.

¿Cuál es la mejor manera de lograr esto o me falta algo obvio? Gracias por adelantado.

FYI: No estoy aprovechando django para este proyecto, sino python directo desplegado hasta gae.


Otra manera fácil de lograr eso (sin tener que anular to_dict ) es agregar una to_dict ComputedProperty que devuelve el id, así:

class MyModel(ndb.Model): # this property always returns the value of self.key.id() uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False) # other properties ...

Se agregará una Propiedad ComputedProperty al resultado de to_dict al igual que cualquier otra propiedad.

Solo hay dos restricciones:

  1. Aparentemente, el nombre de la propiedad no puede ser key (ya que entraría en conflicto con la clave real) y la id tampoco funciona.
  2. Esto no funcionará si no especifica una clave o identificación cuando crea el objeto.

Además, el valor calculado se escribirá en el almacén de datos cuando llame a put() , por lo que consume parte de su espacio de almacenamiento.

Una ventaja es que esto admite los argumentos de include y exclude de to_dict() fuera de la caja.