Odoo 14 Shell中查询返回空记录集的原因排查
搜索域语法与类型错误:Odoo搜索域要求是嵌套列表格式,且字段值类型需与字段定义匹配。你当前的写法
['model_B_id', '=', '17' ]有两个问题:- 缺少外层括号,正确格式应为
[('model_B_id', '=', 17)]; model_B_id作为关联字段(many2one)存储的是整数ID,你用字符串'17'匹配会导致类型不匹配,数据库无法找到对应记录。
修正后执行:env['model_A'].search([('model_B_id', '=', 17)])
- 缺少外层括号,正确格式应为
权限限制:当前Shell会话使用的用户没有
model_A模型的读取权限,或无法访问那些model_B_id=17的具体记录。Odoo的search方法会自动应用访问控制规则(ACL)和记录规则(Record Rules),权限不足时会返回空记录集。可以尝试用sudo()绕过权限验证测试:env['model_A'].sudo().search([('model_B_id', '=', 17)]),如果能返回记录,就说明是权限问题。归档过滤:如果
model_A模型包含active字段,search方法默认只会返回active=True的记录。若目标记录已被归档(active=False),则不会被查询到。可以在搜索域中添加过滤条件:env['model_A'].search([('model_B_id', '=', 17), ('active', 'in', [True, False])]),或直接用with_context(active_test=False)关闭归档过滤:env['model_A'].with_context(active_test=False).search([('model_B_id', '=', 17)])模型标识符错误:确认
model_A是正确的模型内部标识符(Odoo模型名通常为小写点分隔格式,比如res.partner)。如果模型名写错,虽然会返回空的模型记录集对象,但实际并未查询到目标数据。可以通过env['model_A']._name验证模型是否正确。
内容的提问来源于stack exchange,提问作者user1632812

