You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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,

问题分析与解决办法

  1. 域表达式逻辑错误
    Odoo的域表达式中,&是二元运算符,需要对应两个条件。你的写法里运算符数量和条件不匹配,导致逻辑混乱。三元条件(A且B且C)可以直接省略&(默认所有条件为逻辑与),或者写成['&', '&', A, B, C]的显式格式。

  2. 关联字段匹配方式错误
    product_id和lot_id是关联字段,直接用字符串名称匹配不生效,需要通过关联字段的name属性来匹配,或者使用对应记录的ID。

  3. 计算字段过滤限制
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:02:53