Odoo中外键route_id值判断异常问题求助
问题解决:Odoo订单行route_id筛选异常处理
问题原因
在Odoo中,route_id作为外键字段,存储的是关联的route对象(RecordSet实例),而非直接的整数值:
- 使用
lambda l: l.route_id == 11时,是将对象和整数11做比较,永远不相等,导致筛选结果为空,最终dropship_notes_ind始终为False。 - 使用
lambda l: l.route_id时,仅判断字段是否非空,会包含所有route_id不为Null的记录,不符合仅筛选route_id为11的需求。
解决方案
有两种可行的修改方式:
方式1:通过对象id属性判断
修改lambda表达式,先判断route_id非空,再比较其id属性:
def _compute_dropship_notes_ind(self): for order in self: # 筛选route_id为11的订单行 any_dropship_lines = order.order_line.filtered(lambda l: l.route_id and l.route_id.id == 11) order.dropship_notes_ind = bool(any_dropship_lines)
方式2:使用Odoo域表达式(推荐)
利用Odoo内置的域筛选语法,filtered方法支持直接传入域列表,Odoo会自动处理外键关联逻辑,性能更优:
def _compute_dropship_notes_ind(self): for order in self: # 用域表达式精准筛选route_id为11的记录 any_dropship_lines = order.order_line.filtered([('route_id', '=', 11)]) order.dropship_notes_ind = bool(any_dropship_lines)
说明
- 方式1通过判断对象的
id属性实现精准匹配,同时加入l.route_id判断避免Null值引发的AttributeError。 - 方式2的域表达式是Odoo推荐的筛选方式,会转化为SQL查询在数据库层面完成筛选,比内存中遍历lambda表达式效率更高,且无需手动处理Null情况。
内容的提问来源于stack exchange,提问作者ASofrohan
相关产品推荐
相关产品推荐

