結論を先に書くと、モデルのput()を次のようにオーバーライドすることで、保存時に値を変更することができた。
なお、サンプルコードはKay-Frameworkを使用している。
myapp/models.py
from google.appengine.ext import db
class MyModel(db.Model):
name = db.StringProperty()
def put(self):
self.name = u'foo'
return db.Model.put(self)
当初、フックを使って値を変更しようと思い、次のようなコードを書いた。
settings.py
USE_DB_HOOK = True #追加
myapp/__init__.py
from kay.utils.db_hook import register_pre_save_hook
from myapp.models import MyModel
def my_pre_save(entity, put_type_id):
entity.name = u'foo'
register_pre_save_hook(my_pre_save, MyModel)
保存時にフックの関数は呼ばれ、モデルの値を変更している。
しかし、保存された値をみると、変更が反映されていない。
フックで書き換えた値は保存されないようだ。
そこで、モデルのput()をオーバーライドすることにした。
from google.appengine.ext import db
class MyModel(db.Model):
name = db.StringProperty()
def put(self):
self.name = u'foo'
return db.Model.put(self)
この方法で、変更した値が保存された。
「Override get and put methods to enforce business logic」には、保存時にUserPropertyに現在のユーザーを登録するコードがある。