3

我想在我的 OpenERP 模块中缓存一些结果,所以我挖了一下,找到了缓存装饰器。不幸的是,我能找到的大多数文档都在类声明中:

将其用作您计划缓存的函数的装饰器 Timeout: 0 = 无超时,否则以秒为单位

任何人都可以推荐一个如何使用它的好例子吗?是否存在需要避免的已知问题?

4

2 回答 2

5

在挖掘了更多之后,我发现的最简单的例子是ir_model_data._get_id() 方法

@tools.cache()
def _get_id(self, cr, uid, module, xml_id):
    ids = self.search(cr, uid, [('module','=',module),('name','=', xml_id)])
    if not ids:
        raise ValueError('No references to %s.%s' % (module, xml_id))
    # the sql constraints ensure us we have only one result
    return ids[0]

似乎您只需选择要缓存的模型方法,然后将缓存添加为装饰器如果某些事件应该像这个 update() 方法那样清除缓存,则使用缓存方法作为缓存对象:

            if not result3:
                self._get_id.clear_cache(cr.dbname, uid, module, xml_id)

看起来默认情况下,方法的前两个参数在缓存时被忽略(大多数情况下是光标和用户 ID)。

这一切都只是基于略读代码。我很想听听任何实际使用过它的人的反馈。

于 2010-07-05T21:17:18.107 回答
3

缓存目前更可用,因为它是 LRU 而不是无限缓存。

http://bazaar.launchpad.net/~openerp/openobject-server/5.0/revision/2151

看起来默认情况下,方法的前两个参数在缓存时被忽略(大多数情况下是光标和用户 ID)。

  1. 这可以通过传递skiparg参数来修改
  2. 被跳过的参数是隐式传递的 self 和 cursor。当 skiparg 为 2 时,用户 ID 用于缓存。
于 2011-03-24T17:20:43.040 回答