odoo自带的mail.thread模块具备字段变化记录功能,不过针对One2many和Many2many字段不生效 具体原因可以查看odoo源码中odoo/addons/mail/models/mail_tracking_value.py 中45行create_tracking_values函数中的处理
字段追踪及消息记录参考我另一篇文章:
如果我们实际开发中又需要实现记录many2many字段变化怎么办呢?
这里我通过自己写后台代码去检测many2many字段的变化,并将变化的结果发送到了消息记录模板实现了这一功能。
purchaser_id = fields.Many2many('hr.employee', 'purchaser_id_rel', column1='purchaser_id', column2='hr_employee_id', string='采购员', required=True)
def write(self, vals):
# 添加采购人员记录变化跟踪
self.ensure_one() # 确保记录为单个记录
if 'purchaser_id' in vals:
initial_value = self.purchaser_id.ids
new_value = vals['purchaser_id'][0][2]
# 判断两个列表是否相等
if not operator.eq(initial_value, new_value):
old = self.env['hr.employee'].search_read([('id', 'in', initial_value)])
old_value_name = list(lst['name'] for lst in old)
str = ','
new = self.env['hr.employee'].search_read([('id', 'in', new_value)])
new_value_name = list(lst['name'] for lst in new)
body = '采购员:[%s]→[%s]' % (str.join(old_value_name), str.join(new_value_name))
# 发送记录消息到chatter模板
self.message_post(body=body, message_type='notification')
return super(SupplierManagement, self).write(vals)
效果: