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:
- Aparentemente, el nombre de la propiedad no puede ser
key
(ya que entraría en conflicto con la clave real) y laid
tampoco funciona. - 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.