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

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 del objeto o el elemento principal en el dictado 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 llave para estar en el dictado. 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 desplegado directamente hasta gae.

No te estás perdiendo nada 😉

Simplemente agregue la clave al diccionario después de llamar a to_dict, 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 una mezcla.

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 

Luego de usarlo.

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

Otra forma fácil de lograrlo (sin tener que anular to_dict ) es agregar una ComputedProperty que devuelva el ID, de esta manera:

 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á un ComputedProperty al resultado de to_dict como cualquier otra propiedad.

Solo hay dos restricciones:

  1. Aparentemente, el nombre de la propiedad no puede ser key (ya que podría entrar en conflicto con la clave real) y la id tampoco funciona.
  2. Esto no funcionará si no especifica una clave o una identificación al crear 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.