En Appengine, intento que el valor de una propiedad se calcule automáticamente y se almacene con el objeto.¿Cómo sobrescribir el método put() en un modelo de motor de aplicación python?
Tengo una clase, Rectángulo, y tiene un ancho, alto y área. Obviamente, el área es una función de ancho y alto, pero quiero que sea una propiedad porque quiero usarlo para clasificar. Así que trato de modificar la función put() para colarse al área en el almacenamiento del rectángulo de este modo:
class Rectangle(db.Model):
width = db.IntegerProperty()
height = db.IntegerProperty()
area = db.IntegerProperty()
def put(self, **kwargs):
self.area = self.width * self.height
super(Rectangle, self).put(**kwargs)
Esto funciona cuando invoco put()
en el objeto Área directa:
re1 = Rectangle(width=10, height=10)
re1.put()
print re1.area # >> 10
Pero cuando Yo uso db.put()
(por ejemplo, para guardar muchos de ellos a la vez), esto se rompe.
re2 = Rectangle(width=5, height=5)
db.put(re2)
print re2.area # >> None
¿Cuál es la forma correcta de 'escabullirse' en el valor calculado?
¿Qué obtienes si recoges el artículo de la base de datos? es el area calculada? – rocksportrocker
Revisé el almacén de datos y dice lo mismo; '10' para el primer rectángulo y' None' para el segundo. – Paul
Sospecho que 'db.put()' nunca llama al método individual 'put()' en los objetos, probablemente los inspecciona en busca de propiedades de base de datos y crea instrucciones de inserción masiva. Si configura el área en '__init__' en lugar de' put', ¿qué ocurre? – larsks