在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装饰的方法必须是模型的方法,而且这个方法不能有参数。
本质还是调用了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()