Odoo13继承crm.lead模型读取one2many字段order_ids报栈溢出如何解决
错误原因
- 计算字段的实现逻辑不符合Odoo ORM规范:计算字段的处理方法不需要返回值,而是需要直接为
self中的每条记录的对应字段赋值,你写的return逻辑会导致Odoo反复触发计算逻辑,最终栈溢出。 - 缺少
@api.depends装饰器:Odoo的计算字段必须显式声明依赖字段,才能正确触发计算,也能避免不必要的重复计算。 - 不需要通过
super调用order_ids:你已经正确继承了crm.lead模型,直接通过当前记录实例就能访问sale_crm模块新增的order_ids字段,多余的super调用也可能导致递归问题。 - 没有适配多记录集场景:Odoo的ORM方法传入的
self通常是包含多条记录的集合,需要遍历处理每一条记录,直接操作self整体会导致逻辑错误。
正确实现代码
from odoo import api, fields, models class Co7Lead(models.Model): _inherit = "crm.lead" so_list = fields.Text( compute='_compute_so_list', string="Text list of associated SOs", help="A comma separated list of SOs associated with this lead" ) @api.depends('order_ids.name') def _compute_so_list(self): for lead in self: # 直接提取所有关联订单的名称,逗号拼接后赋值 so_name_list = lead.order_ids.mapped('name') lead.so_list = ', '.join(so_name_list)
逻辑说明
@api.depends('order_ids.name')声明计算依赖关联销售订单的name字段,只要关联的订单发生变化、或者订单名称发生修改,都会自动触发so_list字段的重新计算。- 遍历
self中的每一条线索记录,兼容多记录批量处理的场景。 - 用ORM内置的
mapped方法直接提取所有关联订单的名称,不需要手动循环拼接,代码更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者Matthew Goulart
相关产品推荐
相关产品推荐

