odoo 一日一技 @api.autovacuum

发布时间:2024年01月12日

基础介绍???

在Odoo中,@api.autovacuum是一个装饰器,它用于标记一个方法,使得这个方法可以被Odoo的自动清理机制调用。

Odoo的自动清理机制是一个定期运行的任务,它会定期清理数据库中的旧数据,以保持数据库的性能。这个机制会定期调用所有被@api.autovacuum装饰的方法。

功能示例

下面是一个使用@api.autovacuum的例子:

from odoo import models, api

class MyModel(models.Model):
    _name = 'my.model'

    @api.autovacuum
    def _my_cleanup_task(self):
        # 这个方法会被Odoo的自动清理机制调用
        # 在这里,你可以编写清理数据库的代码
        pass

在这个例子中,_my_cleanup_task方法被@api.autovacuum装饰,所以它会被Odoo的自动清理机制调用。你可以在这个方法中编写清理数据库的代码。
注意,被@api.autovacuum装饰的方法必须是模型的方法,而且这个方法不能有参数。

深入源码 当前版本为17.0

本质还是调用了ir.cron模型,base初始化了定时清理任务,默认为一天清理一次。?可以自己定义。

<record id="autovacuum_job" model="ir.cron">
        <field name="name">Base: Auto-vacuum internal data</field>
        <field name="model_id" ref="model_ir_autovacuum"/>
        <field name="state">code</field>
        <field name="code">model._run_vacuum_cleaner()</field>
        <field name='interval_number'>1</field>
        <field name='interval_type'>days</field>
        <field name="numbercall">-1</field>
    </record>

调用指定清理函数

def is_autovacuum(func):
    """ Return whether ``func`` is an autovacuum method. """
    return callable(func) and getattr(func, '_autovacuum', False)


class AutoVacuum(models.AbstractModel):
    """ Helper model to the ``@api.autovacuum`` method decorator. """
    _name = 'ir.autovacuum'
    _description = 'Automatic Vacuum'

    def _run_vacuum_cleaner(self):
        """
        Perform a complete database cleanup by safely calling every
        ``@api.autovacuum`` decorated method.
        """
        if not self.env.is_admin():
            raise AccessDenied()
        for model in self.env.values():
            cls = type(model)
            for attr, func in inspect.getmembers(cls, is_autovacuum):
                _logger.debug('Calling %s.%s()', model, attr)
                try:
                    func(model)
                    self.env.cr.commit()
                except Exception:
                    _logger.exception("Failed %s.%s()", model, attr)
                    self.env.cr.rollback()
文章来源:https://blog.csdn.net/qq_40815295/article/details/135548285
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。