如何通过Odoo外部API正确过滤?查询结果不符合预期
Odoo外部API数据过滤问题
我通过Odoo外部API编写过滤代码,尝试筛选stock.quant中满足指定产品、批次且on_hand=True的记录,但查询返回结果里on_hand字段值却是False,尝试多种过滤方式都没解决,官方文档说明不够清晰,求助解决办法。
我的代码如下:
search_domain = [ '&', ('product_id', '=', 'Product_x'), '&', ('lot_id', '=', 'AG:04/10/2023:UID520:6666'), ('on_hand', '=', True), ] # Use the search domain to find the specific location lookuplocationbasedonname = models.execute_kw(db, uid, password, 'stock.quant', 'search_read', [search_domain]) pprint(lookuplocationbasedonname)
返回结果中on_hand字段:
'on_hand': False,
问题分析与解决办法
域表达式逻辑错误
Odoo的域表达式中,&是二元运算符,需要对应两个条件。你的写法里运算符数量和条件不匹配,导致逻辑混乱。三元条件(A且B且C)可以直接省略&(默认所有条件为逻辑与),或者写成['&', '&', A, B, C]的显式格式。关联字段匹配方式错误
product_id和lot_id是关联字段,直接用字符串名称匹配不生效,需要通过关联字段的name属性来匹配,或者使用对应记录的ID。计算字段过滤限制
on_hand是计算字段,如果该字段未设置stored=True,直接过滤会失效,可改用quantity > 0来等效筛选(因为on_hand通常基于quantity计算)。
修正后的代码示例
# 方式1:默认逻辑与,简化写法并修正关联字段匹配 search_domain = [ ('product_id.name', '=', 'Product_x'), ('lot_id.name', '=', 'AG:04/10/2023:UID520:6666'), ('quantity', '>', 0) # 替代on_hand=True,避免计算字段过滤问题 ] # 方式2:显式逻辑与格式 search_domain = [ '&', '&', ('product_id.name', '=', 'Product_x'), ('lot_id.name', '=', 'AG:04/10/2023:UID520:6666'), ('quantity', '>', 0) ] # 执行查询 lookuplocationbasedonname = models.execute_kw(db, uid, password, 'stock.quant', 'search_read', [search_domain]) pprint(lookuplocationbasedonname)
额外排查点
- 确认
on_hand字段的存储属性:在Odoo后台查看stock.quant模型的on_hand字段定义,若stored为False,则必须用可存储字段替代过滤。 - 验证产品、批次名称的准确性:检查大小写、特殊字符是否完全匹配,避免因匹配失败返回不符合预期的记录。
- 检查API用户权限:确保当前用户拥有
stock.quant模型的读取权限,以及对应产品、批次的访问权限。
内容的提问来源于stack exchange,提问作者apexprogramming
相关产品推荐
相关产品推荐

