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

