Odoo 15中Many2one字段显示x.y 1而非关联表值的问题排查
Odoo Many2one字段显示默认标识而非自定义字段的解决方法
问题描述
在Z.X模型的parent_id(关联x.y模型的Many2one字段)中,实际显示的是x.y 1、x.y 2这类默认标识,而非x.y模型中存储的患者姓名(pat_fullname字段值)。
原因分析
Odoo中Many2one字段的显示内容由关联模型的显示名称规则决定:
- 默认情况下,系统会优先查找模型中的
name字段作为显示值; - 如果模型没有定义
name字段,就会自动生成模型标识 + 记录序号的格式(比如x.y 1)。
你的x.y模型仅定义了pat_fullname和pat_age字段,没有name字段,也未指定自定义显示字段,因此触发了默认规则。
解决方案
有两种简单的方式解决这个问题,任选其一即可:
方案1:指定默认显示字段(推荐)
在x.y模型中添加_rec_name属性,直接指定用pat_fullname作为该模型记录的显示名称:
from odoo import fields, models, api, _ class XY(models.Model): _name = 'x.y' _rec_name = 'pat_fullname' # 新增此行,指定显示字段 pat_fullname = fields.Char(string='Full Name') pat_age = fields.Integer(string='Age')
方案2:自定义显示名称(支持组合字段)
如果需要显示更复杂的内容(比如姓名+年龄),可以重写模型的name_get()方法:
from odoo import fields, models, api, _ class XY(models.Model): _name = 'x.y' pat_fullname = fields.Char(string='Full Name') pat_age = fields.Integer(string='Age') @api.depends('pat_fullname', 'pat_age') def name_get(self): result = [] for rec in self: # 自定义显示格式,比如姓名+年龄 display_name = f"{rec.pat_fullname} ({rec.pat_age}岁)" if rec.pat_age else rec.pat_fullname result.append((rec.id, display_name)) return result
生效步骤
修改代码后,需要:
- 升级对应的Odoo模块;
- 刷新页面,此时Z.X模型的
parent_id字段就会显示指定的自定义内容。
内容的提问来源于stack exchange,提问作者Zoro
相关产品推荐
相关产品推荐

