Переопределить методы сохранения, размещения, получения и т. Д. В Google App Engine - PullRequest
9 голосов
/ 02 мая 2010

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

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

Спасибо!

Ответы [ 3 ]

13 голосов
/ 02 мая 2010

Да, можно переопределить эти методы. Взгляните на это сообщение в блоге Ника Джонсона . Класс подключенной модели выглядит так:

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

Вас также может заинтересовать "производные свойства" .

1 голос
/ 11 февраля 2014

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

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

Пересмотренный код:

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, если вы хотите использовать обезьянье патчирование, или ответ Криса Фармилоя об использовании асинхронных методов.

1 голос
/ 23 мая 2011

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

См. Хуки API AppEngine PreCall

...