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
相关产品推荐
相关产品推荐

