如果你曾想知道某条记录的某个字段是谁什么时候改的,Odoo 的字段跟踪功能能直接给出答案。
Odoo 能在记录的讨论区(chatter)自动记录被标记为“跟踪”的字段每次改动——显示旧值、新值、时间和操作人,从而免去额外搭建审计系统的麻烦。
无论你是用 Odoo Studio 配置字段,还是在自定义模块里写 Python,掌握字段跟踪对理解 Odoo 的数据模型至关重要。本指南覆盖了从原理到落地的关键点。
什么是 Odoo 中的字段跟踪(Tracking)
在 Odoo 里,跟踪不是一种独立的数据类型,而是给现有字段(如 Char、Many2one、Selection、Integer、Date 等)加上的一个属性。打开后,任何值的变化都会被记录到 chatter 中,连带显示修改前后内容、时间与操作者。
用户界面上你会看到类似的日志:一条消息说明了变化,例如销售机会的阶段从“新建”变为“已资格确认”,并由系统在变更发生时自动写入记录讨论区。
绝大多数标准字段类型都支持这个属性,你既可以通过 Odoo Studio 启用,也可以在 Python 代码里为字段添加 tracking 属性来实现。
那些具体会被保存的数据
每次跟踪到的变更会以一条 mail.message 记录形式挂在对应文档上,消息里包含:
- 发生变化字段的标签(字段名或显示名称)
- 变更前的旧值
- 变更后的新值
- 修改发生的时间戳
- 执行改动的用户信息
任何对该记录有读取权限的人都能看到这段历史。除非开启跟踪,否则无需做额外配置;开启后记录会自动出现。
字段跟踪的工作原理概述
要使跟踪生效,模型必须引入 mail.thread 混入(mixin),它提供了消息和日志基础设施。Odoo 许多标准业务模型如 sale.order、crm.lead、account.move、stock.picking 等都已经继承了该 mixin。
当用户保存包含被跟踪字段的记录时,Odoo 会自动比较旧值与新值,若不同就把变更写入 chatter,用户无需额外操作。
在 Odoo ORM 中的技术行为
从技术角度看,ORM 在模型层拦截 write 操作。write() 修改被跟踪字段时,框架会捕获先前值、应用新值,然后创建一条描述差异的 mail.message。
在 Python 模块中,给字段加上 tracking=True 即可启用跟踪:
例如在字段定义里:state = fields.Selection([('draft','Draft'),('confirmed','Confirmed')], tracking=True)
你也可以传入 1 到 10 的优先级数字来控制在一次保存中多字段同时变化时日志的显示顺序,数值越小越靠前。
例如:partner_id = fields.Many2one('res.partner', tracking=1) priority = fields.Selection(tracking=10)
与其它记录的交互行为
跟踪信息直接保存在字段所属的记录上,不会自动传播到关联记录。若希望在相关模型也有变更历史,则需要在每个模型上单独开启跟踪。
这是设计使然——把审计线索保留在被修改对象附近,使审阅历史时不必在多个关联记录中来回翻找。
适用的业务场景与价值
下面举五个日常场景,说明开启字段跟踪能带来的具体价值。
1. 客户关系与销售管道管理
销售团队需要知道线索何时由哪个阶段变更以及是谁操作的。在 CRM 模块对 stage_id 开启跟踪,可以为管理者呈现完整的阶段变更时间轴。
这有助于识别阶段停滞点、支持漏斗评估,并能用真实数据而非记忆来指导销售培训。
2. 采购与发票的审批流
在财务与采购场景中,合规与审计常需要明确谁何时批准了某份单据。对采购订单或供应商账单的 state 字段启用跟踪,能在 chatter 里直接看到这些审批历史,无需额外审计模块。
这对受到财务控制或内部审计要求的公司尤其重要。
3. 库存与仓储管理
当库存数量或储位出现异常时,对库存移动或产品关键字段开启跟踪,能让仓库管理人员迅速定位变动来源。
无需翻阅复杂日志或频繁询问同事,相关记录的讨论区就能给出线索。
4. 客户资料质量管理
如果团队经常更新客户信息,可以对 partner 模型的 email、phone、pricelist_id 等关键字段开启跟踪。在 CRM 中直接保留联系方式变更历史,有助于客服和数据质量审查。
5. 人力资源与员工记录管理
对员工的岗位、部门或薪级等字段启用跟踪,可以保留透明的修改史。这不仅符合许多行业的 HR 合规要求,也让内部审计更容易开展。
如何创建或自定义带跟踪的字段
在 Odoo 中启用字段跟踪有两种主要方式:无代码的 Odoo Studio,或通过 Python 在自定义模块里实现。
通过 Odoo Studio 启用
使用 Odoo Studio 可以在不写代码的情况下给已有字段打开跟踪:进入 Studio 编辑目标模型,点击字段,在字段设置面板中打开“跟踪变更(Track Changes)”开关即可。
启用后该字段之后的所有变更会显示在 chatter。管理员和业务用户可以借此快速自助完成定制,无需开发人员介入。
同样地,通过 Studio 新建自定义字段时也可在创建步骤中直接勾选跟踪选项。
通过 Python 在自定义模块里启用
开发者在扩展或构建模块时,可在模型类的字段定义里直接加入 tracking 属性,这是标准做法。
同时模型需继承 mail.thread,下面是一个最小示例:
示例说明在类定义里同时继承 mail.thread,并定义一个带 tracking 的自定义选择字段。
这是扩展已有模型时常见模式——字段像数据库的普通字段那样工作,但每次值变更都会被自动记录。
关于自定义模型的重要提示
若你创建全新的自定义模型,请确保在模型定义中包含 _inherit = ['mail.thread', 'mail.activity.mixin']。否则跟踪属性会被忽略,变更不会出现在 chatter。
这一点常常让初次按教程操作的开发者困惑:如果不继承相关 mixin,跟踪功能根本无法生效。
实务最佳做法
字段跟踪很容易设置,但也很容易被滥用。下面的建议能帮助你把功能用到刀刃上。
只对重要字段开启跟踪
为所有字段都打开跟踪只会在讨论区产生噪音,反而难以找到关键历史。把注意力放在真正需要审计的字段上:状态、阶段、负责人、关键日期和财务字段。
使用优先级数字以提高可读性
当同一模型上有多个被跟踪字段时,使用 1–10 的优先级控制日志分组与显示顺序,让讨论区在多字段同时变化时更清晰。
与权限控制结合使用
跟踪记录在权限不当的情况下价值有限:若所有人都能随意改动数据,审计轨迹就失去意义。上线前先梳理好访问权限与记录规则。
记录被跟踪字段清单
在多人或多开发者项目中,维护一份已启用跟踪字段的清单很重要,能避免代码审查时混淆或在模块升级时无意中重复配置。
上线前务必测试
先在预发布环境验证跟踪行为再推到生产。有些字段类型(尤其是计算字段或 related 字段)在跟踪时表现可能与普通存储字段不同。
常见错误与陷阱
下面列出使用字段跟踪时最常见的问题与误区。
忘记继承 mail.thread
这是最常见的问题。如果自定义模型没有继承 mail.thread,跟踪属性会被静默忽略:不会报错,但 chatter 不会出现任何日志。遇到无效跟踪先检查模型继承链。
给未存储的计算字段启用跟踪
计算字段只有在设置 store=True 并持久化到数据库时才适合跟踪。非存储计算字段在数据库中没有持久值,无法比较前后;给它们启用跟踪会被静默忽略。
对太多字段开启跟踪
虽然看似提高透明度,但对过多字段启用会让讨论区被淹没,反而降低效率。应聚焦于对业务或合规有实际价值的字段。
期望对绕过 ORM 的批量或 SQL 更新也被跟踪
跟踪由 Odoo ORM 在标准 write() 流程触发。如果你直接用 SQL 更新、或通过绕过 ORM 的批量导入、某些底层 API 调用,跟踪不会生效。使用 XML-RPC 或批量操作时请确保写操作走 ORM。
Studio 与代码定义冲突
若某字段最初在 Studio 中创建并开启了跟踪,又在 Python 模块里同时修改定义,升级或更新时可能产生冲突并导致异常行为。对同一字段同时在 Studio 与代码层改动要格外谨慎。
常见问题解答
我可以在 Odoo 的任意模型上启用字段跟踪吗?
只有继承了 mail.thread 的模型支持字段跟踪。许多 Odoo 标准业务模型默认包含该 mixin,但自定义模型必须显式声明。
开启跟踪会影响系统性能吗?
对大多数场景影响甚微:每次被跟踪的变更会增加一条 mail.message,写入时带来小幅开销。对高并发、高事务量的模型,需谨慎选择要跟踪的字段,以免产生过多日志记录。
我关闭某个字段的跟踪会丢失现有历史吗?
不会。关闭跟踪只会阻止未来新增日志,已存在的 chatter 消息会被保留,历史记录不会被删除。
Many2many 字段可以被跟踪吗?
支持 Many2many 跟踪,但显示方式不同:讨论区会列出被添加或移除的关联记录,而不是像简单值字段那样显示“之前→之后”的单一值对比。
没有 Odoo Studio,我还能用跟踪功能吗?
当然可以。tracking 是 Odoo Python 字段的标准属性,任何自定义模块都可通过代码启用。Studio 只是提供了一个可视化的无代码界面,功能本质与代码配置相同。
总结
跟踪是那种不起眼却能带来高价值的 Odoo 功能:在关键字段上启用它能为团队提供可靠的审计轨迹,减少关于“谁改了什么”的争议,并促进更好的数据治理。
无论你是通过 Odoo Studio 快速配置,还是在自定义 Python 模块中系统性实现,最终效果相同:清晰可查的业务数据变更历史。
关键在于明智地选择应用对象:把精力放在驱动审批、决策和责任链的字段上,就能用最少的工作量获得最大价值。
在 Dasolo,我们帮助企业根据自身流程实现并优化 Odoo。无论是设计数据模型、在流程中启用字段跟踪,还是从零构建定制模块,我们都能提供专业支持。
欢迎随时联系,一起讨论你的 Odoo 实施方案。 联系我们 让我们一起为你的项目找到最佳实现路径。