如何在Odoo 16中为many2many字段(标签)添加chatter?
Odoo many2many标签字段添加Chatter跟踪的解决方案
Odoo原生不支持many2many字段通过tracking=true实现Chatter跟踪,以下是两种可行的手动实现方案:
方式一:重写write方法推送自定义消息
直接在目标模型中重写write方法,对比标签修改前后的差异,将变动内容以消息形式发布到Chatter:
from odoo import models, api class YourTargetModel(models.Model): _inherit = 'your.target.model' # 替换为实际模型名,如'res.partner' def write(self, vals): # 预存修改前的标签数据 old_tags = {rec.id: rec.tag_ids for rec in self} # 执行原始write操作 result = super().write(vals) # 检查是否修改了tag_ids字段 if 'tag_ids' in vals: for rec in self: new_tags = rec.tag_ids diff_add = new_tags - old_tags[rec.id] diff_remove = old_tags[rec.id] - new_tags msg_parts = [] if diff_add: msg_parts.append(f"添加标签:{', '.join(diff_add.mapped('name'))}") if diff_remove: msg_parts.append(f"移除标签:{', '.join(diff_remove.mapped('name'))}") # 有变动则推送消息到Chatter if msg_parts: rec.message_post(body='<br>'.join(msg_parts)) return result
方式二:利用原生跟踪模型实现统一样式
如果希望跟踪记录和原生tracking=true字段的样式一致,可以借助mail.tracking.value模型创建标准跟踪记录:
from odoo import models, api class YourTargetModel(models.Model): _inherit = 'your.target.model' @api.model def _get_tracked_fields(self): # 将tag_ids加入跟踪字段列表 tracked_fields = super()._get_tracked_fields() if 'tag_ids' not in tracked_fields: tracked_fields.append('tag_ids') return tracked_fields def write(self, vals): old_tag_vals = {rec.id: rec.tag_ids for rec in self} result = super().write(vals) if 'tag_ids' in vals: for rec in self: new_tags = rec.tag_ids old_tags = old_tag_vals[rec.id] if new_tags != old_tags: # 创建标准跟踪记录 self.env['mail.tracking.value'].create({ 'field': 'tag_ids', 'field_desc': '标签', 'res_id': rec.id, 'res_model': self._name, 'old_value': ', '.join(old_tags.mapped('name')) if old_tags else '', 'new_value': ', '.join(new_tags.mapped('name')) if new_tags else '', }) # 触发Chatter消息通知 rec._message_auto_subscribe_notify([], tracked_fields=['tag_ids']) return result
注意事项
- 确保目标模型已继承
mail.thread混合模型(Chatter功能依赖此模型) - 测试时需验证标签添加/移除操作后,Chatter是否正常生成对应消息
- 多权限场景下,需保证当前用户拥有
message_post的操作权限
内容的提问来源于stack exchange,提问作者Satish Prajapati
相关产品推荐
相关产品推荐

