2010-05-02 4 views

Respuesta

13

Sí, es posible anular estos métodos. Echar un vistazo a esta clase de modelo .El enganchado blog post by Nick Johnson mira esto:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    super(HookedModel, self).put(**kwargs) 
    self.after_put() 

Leer el blog para ver cómo manejar el método db.put() también.

Te podría interesar "derived properties".

+5

Realmente tengo que entrar más rápido. ;) –

+0

put() debería devolver una clave: he enviado una edición a esta respuesta para agregarla. – wodow

+0

@wodow, * no * es aceptable que edite el código de otra persona para agregar su propio código, * especialmente si es la respuesta aceptada *. Si realmente siente que tiene algo que agregar, agregue su propia respuesta o solicite al autor de la respuesta que ajuste su código. He retrocedido tu edición. – Sheridan

1

he publicado una extensión a la clase de HookedModel jbochi por lo que los métodos before_put y after_put se invocan correctamente cuando se llama desde db.put() y la _async familia de funciones.

Ver AppEngine PreCall API hooks

1

he intentado mejorar la respuesta por @jbochi:

  1. Según https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put, put() debería devolver un Key, por lo que el valor de retorno de la biblioteca debe pasar a través .
  2. db.Model.save(), aunque está obsoleto, a veces se sigue utilizando, (b) es un sinónimo de put() y (c) aparentemente no se ha llamado directamente por put(), por lo que debe manejarse manualmente.

Código revisado:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).put(**kwargs) 
    self.after_put() 
    return result 

    def save(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).save(**kwargs) 
    self.after_put() 
    return result 

Todavía deberá leer http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models si desea utilizar el monkeypatching, o la respuesta de Chris Farmiloe para el uso de los métodos asincrónicos.