2010-05-02 2 views

Répondre

13

Oui, il est possible de remplacer ces méthodes. Jetez un oeil à cette blog post by Nick Johnson .La classe modèle accroché ressemble à ceci:

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() 

Lire le blog pour voir comment gérer aussi la méthode db.put().

Vous devriez aussi être intéressé sur "derived properties".

+5

Je dois vraiment aller plus vite. ;) –

+0

put() devrait retourner une clé - J'ai soumis une modification à cette réponse pour l'ajouter. – wodow

+0

@wodow, il est * pas * acceptable pour vous d'éditer le code de quelqu'un d'autre pour ajouter votre propre code, * en particulier si c'est la réponse acceptée *. Si vous pensez vraiment que vous avez quelque chose à ajouter, ajoutez votre propre réponse ou demandez à l'auteur de la réponse d'ajuster son code. J'ai annulé votre modification. – Sheridan

1

J'ai posté une extension de la classe HookedModel de jbochi pour que les méthodes sont invoquées correctement before_put et after_put lorsqu'il est appelé à partir db.put() et la famille _async des fonctions.

Voir AppEngine PreCall API hooks

1

J'ai essayé d'améliorer la réponse par @jbochi:

  1. Selon https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put, put() doit retourner un Key, de sorte que la valeur de retour de la bibliothèque devrait être passé à travers . Bien que désapprouvé, il est (a) parfois utilisé, (b) destiné à être synonyme de put() et (c) apparemment non directement appelé par put() - il doit donc être manipulé manuellement.

Revised Code:

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 

Vous devriez toujours lire http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models si vous souhaitez utiliser le monkeypatching ou la réponse de Chris Farmiloe pour l'utilisation des méthodes async.