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

Odoo11:CSV导入修改字段时需触发track_visibility日志生成

我之前在Odoo 11里也碰到过一模一样的问题!CSV导入默认走批量处理逻辑,会跳过字段变更追踪的触发机制,所以那些设置了track_visibility='onchange'的字段不会生成日志。下面给你两个实用的解决办法,你可以根据自己的需求选择:

方法1:重写Write方法,手动触发日志记录

这个思路是在模型的write方法里,判断当前操作是不是CSV导入,然后手动调用Odoo内置的日志生成函数,把变更记录下来。

代码示例(替换成你的模型名称):

from odoo import models, fields, api

class YourTargetModel(models.Model):
    _inherit = 'your.model.name'  # 改成你实际的模型标识,比如'hr.employee'

    audit_user = fields.Many2one('res.users', string='Audit User', track_visibility='onchange')
    audit_date = fields.Datetime(string="Audit Date", track_visibility='onchange')
    is_audited = fields.Boolean(string='Is Audited', track_visibility='onchange')

    @api.multi
    def write(self, vals):
        # 先执行原本的写入逻辑
        res = super(YourTargetModel, self).write(vals)
        
        # 检查上下文里的导入标记,确认是CSV导入操作
        if self.env.context.get('import_file'):
            for record in self:
                # 遍历需要追踪的字段,逐一检查是否有变更
                tracked_fields = ['audit_user', 'audit_date', 'is_audited']
                for field in tracked_fields:
                    if field in vals:
                        # 获取字段变更前后的值
                        old_val = record._origin[field]
                        new_val = record[field]
                        # 调用Odoo内置的日志方法生成记录
                        record.message_track(field, old_val, new_val)
        return res

这个方式的好处是可以精准控制哪些字段需要生成日志,不会额外触发其他字段的追踪逻辑,适合字段不多的场景。

方法2:修改导入上下文,启用全局追踪

如果希望所有带track_visibility属性的字段在导入时都生成日志,可以通过修改导入时的上下文,强制关闭Odoo的追踪禁用开关。

代码示例:

from odoo import models

class YourTargetModel(models.Model):
    _inherit = 'your.model.name'

    @api.model
    def import_data(self, fields, datas, mode='init', current_module='', noupdate=False, context=None):
        # 重写导入方法,在上下文里强制开启追踪
        context = dict(context or {}, tracking_disable=False)
        return super(YourTargetModel, self).import_data(
            fields, datas, mode=mode, current_module=current_module,
            noupdate=noupdate, context=context
        )

这个方法更通用,但要注意:如果导入的数据量很大,生成大量日志可能会拖慢导入速度,需要根据实际业务场景权衡。

小提示

  • 测试前记得备份数据库,避免导入操作出现意外
  • 如果是继承已有模型,一定要确保_inherit的模型名称完全正确
  • 方法1里的import_file是Odoo导入时自动添加到上下文的标记,用来识别导入操作

内容的提问来源于stack exchange,提问作者Shahriar Amin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:15:36