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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:09:11