Odoo 10递归深度超出运行时错误排查求助
搞定Odoo 10继承sale_order_line时的递归深度超出错误
嘿,作为Odoo老玩家,一眼就看出你代码里的问题啦!咱们一步步拆解:
1. 装饰器混用直接触发无限循环
你给同一个方法同时加了@api.onchange(product_id)和@api.depends(salesman_id),这俩装饰器完全不是一路人啊:
@api.onchange是给前端交互用的,只有用户手动修改字段值时才触发;@api.depends是给计算字段用的,只要依赖的字段发生变化就会自动执行计算。
这么混着用,直接就会形成死循环:比如修改product_id触发onchange方法,要是方法里修改了salesman_id,@api.depends(salesman_id)又会立刻触发这个方法,反复调用直到超出递归上限。
2. 没必要重写product_id字段
你重新声明了product_id,但原sale.order.line模型本来就自带这个字段啊!要是你没打算修改它的核心属性(比如domain、必填性),完全不用重新定义,继承模型时会自动把原字段的所有属性带过来。就算要调整属性,也不用全量重写,直接在继承时针对性修改就行,全量重写反而容易引发字段相关的循环问题。
给你两个修复方案,按需选择:
方案一:产品变更时自动设置销售员(用onchange)
如果你想让用户选完产品后自动填充销售员,用这个:
from odoo import models, fields, api class SaleOrderLine(models.Model): _inherit = 'sale.order.line' # 不用重写product_id,直接继承原字段 salesman_id = fields.Char(string='Salesman') @api.onchange('product_id') def onchange_product_set_salesman(self): for line in self: if line.product_id: # 这里替换成你实际的逻辑,比如从产品关联的销售员字段取值,或者用当前登录用户 line.salesman_id = line.product_id.salesman or self.env.user.name else: line.salesman_id = False
方案二:销售员为自动计算字段(用depends)
如果salesman_id是根据产品或订单销售员自动计算出来的,用这个:
from odoo import models, fields, api class SaleOrderLine(models.Model): _inherit = 'sale.order.line' # 定义为计算字段,指定对应的计算方法 salesman_id = fields.Char(string='Salesman', compute='_compute_salesman_id') @api.depends('product_id', 'order_id.user_id') def _compute_salesman_id(self): for line in self: # 这里写你的计算逻辑,比如优先取产品的销售员,再取订单关联的销售员 salesman = line.order_id.user_id.name if line.order_id.user_id else '' if line.product_id and line.product_id.salesman: salesman = line.product_id.salesman line.salesman_id = salesman
最后再提个小提醒
Odoo 10的递归深度是有限的,千万别在字段变更的方法里修改触发该方法的字段(比如在onchange(product_id)里修改product_id),这会直接触发无限递归,踩坑必中!
内容的提问来源于stack exchange,提问作者NinjaBat
相关产品推荐
相关产品推荐

