appengine のプロパティ クラスを実装しようとしていますdb.ReferenceProperty
。他のデフォルトの戻り値が必要なため、独自のバージョンを実装しています。私の質問は、プロパティが最初にフェッチされたときにのみデータストアクエリが実行されるように、プロパティに戻り値を記憶させるにはどうすればよいですか? 私が持っていたものは以下で、うまくいきません。Property クラスはインスタンスではなくモデル定義に属していると読んだので、戻り値はインスタンスごとにキャッシュされるのではなく、毎回モデルに上書きされると思います。この変数はどこに保存すればよいですか?_resolved
class PageProperty(db.Property):
data_type = Page
def get_value_for_datastore(self, model_instance):
page = super(PageProperty, self).get_value_for_datastore(model_instance)
self._resolved = page
return page.key().name()
def make_value_from_datastore(self, value):
if not hasattr(self, '_resolved'):
self._resolved = Page.get_by_name(value)
return self._resolved
編集
アレックスの答えは確かに使えます。しかし、組み込みdb.ReferenceProperty
は_RESOLVED
モデルインスタンスに変数を保存しているようです。以下によって証明されるように:
[...]
setattr(model_instance, self.__resolved_attr_name(), value)
[...]
def __resolved_attr_name(self):
return '_RESOLVED' + self._attr_name()
get_value_for_datastore
メソッドにはモデル インスタンスが渡されますが、そうではありません。そのメソッドからどのようにプロパティmake_value_from_datastore
を見つけるのでしょうか?_RESOLVED
編集 2
私が収集したコードから、Google はメソッド__get__()
と__set__()
メソッドを使用しており、どちらもモデル インスタンスを引数として取得します。それらはカスタムクラスで使用できますか? と の違いは何get_value_for_datastore
ですか?