Google App Engineでモデルを保存するときに値を変更する

Google App Engineでモデルを保存するときに値を変更する | 山本隆の開発日誌」より。

結論を先に書くと、モデルの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に現在のユーザーを登録するコードがある。