2010-05-02 1 views
9

Можно ли переопределить методы для db.Model в Google App Engine? Я хочу объявить beforeSave, afterSave методы и т. Д., Чтобы создать автоматическую систему тегов.Переопределить методы сохранения, ввода, получения и т. Д. В Google App Engine

Я знаю, что есть крючки, но мне кажется, неправильный способ решить эту проблему :)

Спасибо!

ответ

13

Да, эти методы можно переопределить. Посмотрите на этот blog post by Nick Johnson .The крючковатым класса модели выглядит следующим образом:

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

Читайте блог, чтобы увидеть, как обращаться метод db.put() тоже.

Вы также можете быть заинтересованы в "derived properties".

+5

Мне действительно нужно ускориться. ;) –

+0

put() должен вернуть ключ - я отправил изменение этого ответа, чтобы добавить это. – wodow

+0

@wodow, это * не * приемлемо для вас, чтобы редактировать чужой код, чтобы добавить свой собственный код *, особенно если это принятый ответ *. Если вы действительно чувствуете, что у вас есть что добавить, добавьте свой собственный ответ или попросите автора ответа отредактировать свой код. Я отменил ваше редактирование. – Sheridan

1

Я отправил расширение к jbochi HookedModel класса игровым, так что before_put и after_put методы корректно вызывается при вызове из db.put() и _async семейства функций.

См AppEngine PreCall API hooks

1

Я попытался улучшить ответ по @jbochi:

  1. Согласно https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put, put() должна возвращать Key, так что возвращаемое значение из библиотеки должны быть переданы через ,
  2. db.Model.save(), в то время как устаревший, является (а) иногда еще используемым, (b) означает синоним для put() и (c), по-видимому, не вызванный непосредственно put() - поэтому его следует обрабатывать вручную.

Revised код:

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 

Вы все еще должны читать http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models, если вы хотите использовать monkeypatching или ответ Криса Farmiloe в для использования методов асинхронными.

Смежные вопросы