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

Odoo 16中通过代码为Many2one字段赋值失败

Odoo 16 Many2one字段赋值失败问题解决

你的代码存在几个关键问题导致Many2one字段无法赋值:

  • 字段类型赋值语法错误:(6, 0, [related_ids])是Many2many/One2many这类多值字段的赋值语法,Many2one是单值字段,不能使用该方式赋值。
  • 变量命名冲突:使用Python内置关键字list作为变量名,会覆盖内置函数,引发隐性错误。
  • 未处理多记录集场景:compute方法中self可能是多条记录的集合,直接访问self.partner_id.id会在批量操作时出错。
  • 原生SQL的潜在风险:手动拼接SQL存在注入风险,且不符合Odoo ORM的最佳实践。

修正后的代码

ks_aus_umwandlung = fields.Boolean(string="aus Umwandlung", default=False)
ks_umwandlungs_termin = fields.Many2one('calendar.event', 
                                     store=True, compute='_umwandlungs_termine', 
                                     string="abgeschlossene Termine")

@api.depends("ks_aus_umwandlung", "partner_id")  # 增加partner_id依赖,确保关联字段变化时重新计算
def _umwandlungs_termine(self):
    # 遍历记录集中的每个记录,适配多记录场景
    for record in self:
        if not record.partner_id:
            record.ks_umwandlungs_termin = False
            continue
        # 使用Odoo ORM查询替代原生SQL,避免注入风险
        calendar_events = self.env['calendar.event'].search([
            ('ks_partner_id', '=', record.partner_id.id)
        ])
        # Many2one字段直接赋值单个记录ID或记录对象,此处取第一条匹配记录(可根据业务调整)
        record.ks_umwandlungs_termin = calendar_events[:1].id if calendar_events else False

关键修正说明

  1. Many2one正确赋值方式:直接给字段赋值单个记录ID,或者对应的Odoo记录对象。如果有多个匹配结果,根据业务逻辑选择目标记录(如示例中的第一条)。
  2. 适配多记录集:compute方法中必须遍历self中的每个记录,确保批量操作时每条记录都能正确计算。
  3. ORM查询替代SQL:使用search方法构建查询,既安全又符合Odoo框架规范,同时自动处理权限、上下文等逻辑。
  4. 完善依赖字段:将partner_id加入@api.depends,确保当关联的合作伙伴信息变化时,compute方法能自动重新触发计算。

内容的提问来源于stack exchange,提问作者klausjulius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:12