Odoo15中res.partner的name_get()保存时未触发问题咨询
重写res.partner的name_get()实现组合字段显示后,在Many2One选择弹窗中能正常展示,但保存日记账分录行(account.move.line)后,partner_id仍显示原名称且name_get()未触发,可从以下几个方向排查解决:
检查account.move.line模型的partner_id字段自定义逻辑
部分场景下,继承account.move.line后可能重写了partner_id的显示逻辑,或者字段定义中添加了特殊context、widget影响显示效果。查看该字段的定义,确认是否存在context={'default_display_name': ...}这类配置,或是自定义widget替代了默认的many2one显示逻辑。强制清除partner的display_name缓存
Odoo会缓存记录的display_name值,保存move line时可能未触发缓存更新。可在继承的account.move.line中重写write和create方法,主动刷新对应partner的缓存:def write(self, vals): res = super().write(vals) if 'partner_id' in vals: partner = self.env['res.partner'].browse(vals['partner_id']) partner.invalidate_cache(['display_name'], [partner.id]) return res def create(self, vals): res = super().create(vals) if 'partner_id' in vals: partner = self.env['res.partner'].browse(vals['partner_id']) partner.invalidate_cache(['display_name'], [partner.id]) return res排查自动化操作对display_name的影响
检查是否存在server action、自动化规则等,在保存move line时间接修改了partner的display_name缓存或相关字段值,导致显示异常。确认res.partner的name_get重写全局生效
确保重写name_get()时使用了_inherit = 'res.partner',而非仅针对特定视图生效。可在方法中添加日志输出,验证保存move line时是否真的未触发该方法:import logging _logger = logging.getLogger(__name__) def name_get(self): _logger.info("res.partner的name_get已触发,记录ID:%s", self.ids) return [(acc.id, '{} - {}'.format(acc.custom_field, acc.name) if acc.name else acc.custom_field) for acc in self]执行保存操作后查看日志,确认方法调用情况。
检查视图中partner_id的widget配置
若partner_id字段使用了many2one_reference等特殊widget,可能会绕过name_get()直接显示原字段值。确认account.move.line对应视图中,partner_id的widget为默认的many2one。
内容的提问来源于stack exchange,提问作者Odoo Dev

