Odoo开发如何正确获取one2many字段值 跨模型访问异常排查
代码错误说明与正确实现方案
你的代码存在3个核心问题,直接导致关联字段无法正常访问、无代码提示:
- 模型名拼写错误:自定义的
installment_id字段关联模型写为product.templates,多了末尾的复数s,Odoo原生产品模板的正确模型名是product.template,关联不存在的模型自然无法读取数据。 - 字段类型与定义不规范:一个合同会对应多条
kestet.lines分期记录,你初始写的kestet2_ids = fields.Many2one('kestet.lines')用了多对一字段,逻辑上只能关联1条分期记录,不符合业务场景;后续写的关联字段installment_relation = fields.One2many(related="installment_id.kestet_ids")缺少必填的comodel_name参数,Odoo框架无法解析字段关联关系,自然不会生效。 - 关联逻辑冗余:你已经在
kestet.lines模型中定义了指向property.contract的外键字段property_contract_id,不需要绕路通过产品模板做中转关联。
正确实现代码
根据业务需求二选一即可:
方案1:直接反向关联分期表(推荐,性能最优、支持编辑)
直接复用kestet.lines里已有的property_contract_id外键做一对多反向关联,代码如下:
class PropertyContract(models.Model): _name = "property.contract" _order = 'start_date' name = fields.Char("Contract Number") # 第一个参数传关联的模型名,第二个参数传反向关联的外键字段名 kestet_ids = fields.One2many('kestet.lines', 'property_contract_id', string="合同分期记录")
升级模块后,直接通过点表示法contract_record.kestet_ids就能访问所有关联的分期行,也可以正常读取vlera/data/sel1等分期行字段,IDE会正常弹出代码提示。
方案2:从关联产品上带出分期记录(只读关联场景)
如果业务要求是合同绑定产品后,自动带出产品上预设的分期记录,就修正关联字段的写法:
class PropertyContract(models.Model): _name = "property.contract" _order = 'start_date' name = fields.Char("Contract Number") # 注意模型名不要写错,不要加末尾的s installment_id = fields.Many2one("product.template", string="关联产品") # 一对多关联字段必须指定comodel_name,按需配置store参数决定是否落库存储 installment_relation = fields.One2many( comodel_name="kestet.lines", related="installment_id.kestet_ids", string="产品预设分期", store=True )
注意:
related关联字段默认是只读状态,值会跟随关联的源字段自动同步,如果需要在合同上单独编辑、新增分期记录,不要使用该方案,选择方案1即可。
内容的提问来源于stack exchange,提问作者Jugert Mucoimaj
相关产品推荐
相关产品推荐

