代码之家  ›  专栏  ›  技术社区  ›  Don Kirkby

Openerp缓存功能

  •  3
  • Don Kirkby  · 技术社区  · 15 年前

    我想在openerp模块中缓存一些结果,所以我仔细研究了一下,发现 the cache decorator . 不幸的是,我能找到的大多数文档都在类声明中:

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

    有人能推荐一个如何使用这个的好例子吗?是否有已知的问题需要避免?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Don Kirkby    15 年前

    在深入研究之后,我发现最简单的例子是 ir_model_data._get_id() method :

    @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]
    

    似乎只需选择要缓存的模型方法,然后将缓存添加为 a decorator . 如果某些事件像 this update() method ,将缓存方法用作缓存对象:

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

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

    这都是基于略读代码。我很想听听实际使用它的人的反馈。

        2
  •  3
  •   Sharoon Thomas    14 年前

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

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

    默认情况下,第一个 方法的两个参数是 缓存时忽略(光标和用户 大多数情况下为ID)。

    1. 这可以通过传递skiparg参数来修改
    2. 被跳过的参数是隐式传递的self和cursor。当skiparg为2时,在缓存中使用userid。