0

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ですか?

4

2 に答える 2

2

PagePropertyインスタンスは、エンティティごとではなく、モデルごとに存在します (エンティティはモデル クラスのインスタンスです) 。したがって、 PageProperty インスタンスごとに単一の属性ではなく、 pagename -> Page エンティティをマップする辞書が必要だと思います。たとえば、おそらく次のようなものです...:

class PageProperty(db.Property):
  data_type = Page

  def __init__(self, *a, **k):
    super(PageProperty, self).__init__(*a, **k)
    self._mycache = {}       

  def get_value_for_datastore(self, model_instance):
    page = super(PageProperty, self).get_value_for_datastore(model_instance)        
    name = page.key().name()
    self._mycache[name] = page
    return name

  def make_value_from_datastore(self, value):
    if value not in self._mycache:
        self._mycache[value] = Page.get_by_name(value)
    return self._mycache[value]
于 2010-03-13T15:20:32.333 に答える
1

ReferenceProperty の動作の一部だけを変更したい場合は、default_valueメソッドをオーバーライドして単純に拡張することができます。ReferencePropertyのソースが参考になる場合があります。

于 2010-03-15T19:21:33.920 に答える