我希望为 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
从我收集到的代码__get__()
中,谷歌正在使用and__set__()
方法,这两种方法都将模型实例作为参数。那些可用于自定义类吗?和它的对应物有什么区别get_value_for_datastore
?