You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:12:06