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

Odoo14电商订单确认邮件模板多银行账户调用报错与指定查询

嗨,这个问题我之前做Odoo模板开发时也碰到过,其实核心原因是你调用的bank_ids是一个记录集(recordset)——当只有一个银行账户时,它是单条记录(singleton),直接取字段没问题;但新增第二个后,它变成了多条记录的集合,Odoo没法自动判断你要取哪一条,所以就抛出了Expected singleton的错误。

给你几个实用的解决思路,按需选就行:

1. 固定指定某一个银行账户

如果你只想显示特定ID的银行账户,可以用filtered方法精准筛选,比如要取ID为2的账户:

${object.company_id.bank_ids.filtered(lambda b: b.id == 2).acc_holder_name or ''}
${object.company_id.bank_ids.filtered(lambda b: b.id == 2).bank_name or ''}
${object.company_id.bank_ids.filtered(lambda b: b.id == 2).acc_number or ''}

末尾加or ''是为了防止筛选不到时模板报错,会显示空字符串。

或者你想取第一个创建的账户,也可以直接用索引(记得加判断避免无账户时出错):

${object.company_id.bank_ids[0].acc_holder_name if object.company_id.bank_ids else ''}

2. 遍历显示所有银行账户

如果需要把公司所有银行账户都列在邮件里,用QWeb的循环语法就行,这样不管有多少个账户都能正常显示:

% for bank in object.company_id.bank_ids:
- 账户持有人:${bank.acc_holder_name}
- 银行名称:${bank.bank_name}
- 账号:${bank.acc_number}
<br/>
% endfor

3. 给公司设置默认银行(更优雅的长期方案)

如果经常需要调用默认银行信息,推荐给res.company模型新增一个default_bank_id字段(关联res.partner.bank),然后在公司设置页面就能直接选择默认银行。之后模板里就可以这么调用:

${object.company_id.default_bank_id.acc_holder_name or ''}
${object.company_id.default_bank_id.bank_name or ''}
${object.company_id.default_bank_id.acc_number or ''}

这个方法不用硬编码ID,后续维护起来更方便。

内容的提问来源于stack exchange,提问作者george

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:15:57