odoo13 定时任务【安排的动作】的实现与需要注意的问题

博客围绕给用户增加年龄字段的需求展开。因数据量大且年龄随时间变化,放弃用计算字段和@api.depends实现,转而使用Odoo定时任务。介绍了新建xml文件及相关属性,还说明了编写任务方法代码的注意事项,最后补充安装模块时找不到外部ID的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有这么一个需求,给用户增加一个年龄字段,依赖生日字段取计算。

刚开始想用计算字段和@api.depends 去实现,但后来发现客户已经有一万条了。而且我这个年龄字段是要存储到数据库的。第一,计算字段要保存到数据库(store=True),页面的加载并不会根据依赖字段去计算,那么,只有手动取修改日期的话,才会计算并存储。数据已经有10000+了,我不可能一条一条的改一下日期。第二,这个年龄是岁当前时间在变化的,这次改了,过几天可能就不是这个年龄了。

我想到了odoo里的定时任务,让服务器去做。

新建 data/ir_cron_data.xml 并在__manifest__.py中引用

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="ir_cron_auto_calculate_age" model="ir.cron">
        <field name="name">自动计算年龄</field>
        <field name="interval_number">1</field>
        <field name="interval_type">days</field>
        <field name="numbercall">-1</field>
        <field name="doall" eval="True"/>
        <field name="model_id" ref="model_res_partner"/>
        <field name="code">model._compute_age()</field>
        <field name="state">code</field>
    </record>
</odoo>

上面的几个属性:

name  自动任务的名称

interval_number 和 interval_type 指的是执行频率和执行周期类型,比如:这里为interval_number为1,interval_type为days,就是每天执行1次一次定时任务。

numbercall 是指这个任务一共执行的次数,比如10,那么任务执行10次后将不再执行,这里填写-1,代表一直执行下去。

doall  在服务器重启期间错过了执行时机,是否再次补充执行。

model_id 任务方法所在模型, 格式 model_ + 模型名(res.partner 写成 res_partner,把 . 换成 _ )

state 和 code ,表示这个任务 的功能由代码实现,code 的值格式  model.方法名(),不要忘记方法名后面的括号


接下来,就是编写code指向的方法的代码:

   def _compute_age(self):
        res = self.env['res.partner'].search([])
        for record in res:
            if record.birthday:
                age = self._calculate_age(record.birthday)
                record.write({"age": age})
            else:
                record.write({"age": 0})

需要注意的几点:

  • 将这个代码,写到 model_id  指向的模型中
  • 在方法中,不要直接使用 for record in self , 使用self 是无效的,你需要 使用 env 将记录集取出来,在进行操作。

    下面是安装后,在安排的动作中,看到的样子


2020-05-18 补充

最近有朋友问,为什么在安装模块时,提示找不到(自动动作)外部ID,这种情况大多是因为 model_id 没有指定模块名。比如:你的任务写在了A模块中,但你的任务使用的是B模块中的模型和方法。如果是这种情况,你需要指定模块名:

<field name="model_id" ref="模型所在模块.model_xxxxx"/>

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值