Odoo 17 Domain Filter 行为不一致问题咨询
Odoo中stock.quant过滤结果不一致的原因解析
问题场景
需求是获取指定产品中满足on_hand == True的所有stock.quant记录,但两种操作结果不一致:
- 直接在
stock.quant模型中按产品ID+on_hand过滤搜索,得到预期结果; - 通过产品模型的
stock_quant_ids关联字段获取所有库存批次后,调用filtered_domain按on_hand == True过滤,得到空记录集。
Odoo Shell 执行记录
>>> env['stock.quant'].search([('on_hand','=',True),('product_id','=',6800)]) stock.quant(1189, 7017, 7914) >>> p=env['product.product'].browse(6800) >>> p product.product(6800,) >>> p.stock_quant_ids stock.quant(141, 1189, 1197, 7017, 7914) >>> p.stock_quant_ids.filtered_domain([('on_hand','=',True)]) stock.quant()
原因解析
核心问题出在on_hand字段的属性和filtered_domain的工作机制上:
on_hand是stock.quant模型的计算字段,它的值不直接存储在数据库中,而是通过Python逻辑计算得出(通常基于quantity字段,当quantity > 0时on_hand为True)。- 直接调用
env['stock.quant'].search()时,Odoo会自动将计算字段的过滤条件转换为数据库可执行的SQL逻辑,因此能正确匹配符合条件的记录。 - 通过
p.stock_quant_ids加载关联记录时,on_hand字段值需要在Python层面计算后缓存,但filtered_domain方法依赖字段的数据库存储或已缓存的计算值。如果关联记录加载时on_hand的值未被预计算缓存,或者filtered_domain无法正确处理计算字段的domain条件,就会出现过滤结果为空的情况。
解决方案
如果要在已加载的stock_quant_ids记录集上过滤出on_hand == True的记录,应使用filtered()方法(基于Python逻辑过滤),而非filtered_domain():
p.stock_quant_ids.filtered(lambda q: q.on_hand)
该方法会在Python层面逐个计算每个stock.quant记录的on_hand值,从而得到正确的过滤结果。
内容的提问来源于stack exchange,提问作者Seaworn
相关产品推荐
相关产品推荐

