Odoo 15中如何获取account.move.line模型的tax_ids字段值?
解决Odoo中获取account.move.line对应税ID的问题
问题根源分析
- 代码逻辑错误:你用
account.move的ID去查询account.move.line的ID,这两个模型的ID完全独立、无关联关系。偶尔能获取到ID只是巧合(刚好某个行记录的ID和当前发票ID相同),并非正确的关联方式。 - 字段存储方式误解:
tax_ids是Many2many字段,Odoo不会在account_move_line表中直接存储该字段,而是通过中间关联表(比如account_move_line_account_tax_rel)维护行记录与税的关联,所以直接查account_move_line表看不到这个字段是正常的。
正确实现方式
要获取发票对应的行记录及关联税ID,应通过account.move的line_ids字段(One2many关联到account.move.line)获取对应行,再读取每行的tax_ids:
def _post(self, soft=True): super()._post(soft=soft) # 不要忘记调用父类的_post方法 for move in self: # 遍历当前发票的所有行记录 for line in move.line_ids: # 过滤掉标题、备注等非交易行(可选,根据业务需求调整) if line.display_type not in ('line_section', 'line_note'): # 获取该行关联的税ID列表 tax_id_list = line.tax_ids.ids print(f"行记录ID {line.id} 对应的税ID: {tax_id_list}")
额外说明
- 如果需要直接通过数据库查询,可查询中间关联表,示例SQL(适用于Odoo 14+):
SELECT aml.id AS line_id, at.id AS tax_id FROM account_move_line aml JOIN account_move_line_account_tax_rel rel ON aml.id = rel.account_move_line_id JOIN account_tax at ON rel.account_tax_id = at.id WHERE aml.move_id = 你的发票ID; - 不同Odoo版本的字段名可能有差异(比如旧版本可能用
invoice_line_tax_id),可通过开发者模式查看模型字段确认。
内容的提问来源于stack exchange,提问作者altela
相关产品推荐
相关产品推荐

