Odoo 13自定义模块创建发票时invoice_line_ids仅生成单行问题求助
问题原因分析
- 第一个问题在
_prepare_invoice_line方法的逻辑:你在循环additional_services_ids的过程中,每次都覆盖了res变量的值,循环结束后仅返回了最后一行服务对应的字典,而且方法返回的是单个字典,不是多行数据的列表。 - 第二个问题在
create_invoice方法的传参:invoice_line_ids的ORM操作命令列表里,你仅传入了1组(0, 0, 行数据)的命令,自然只会生成1条发票行。
修正后的代码
首先修改_prepare_invoice_line方法,返回所有行对应的ORM命令列表:
def _prepare_invoice_line(self): res = [] for order in self: for line in order.additional_services_ids: res.append((0, 0, { 'product_id': line.service_id.id, 'quantity': line.quantity, 'name': 'pro', 'discount': 0, 'price_unit': line.price_unit, })) return res
再修改create_invoice方法,直接把返回的命令列表赋值给invoice_line_ids:
def create_invoice(self): invoice = self.env['account.move'].create({ 'type': 'out_invoice', 'state': 'draft', 'journal_id': 1, 'partner_id': self.partner_id.id, 'amount_untaxed': self.package_price, 'ref': self.name, 'invoice_origin': self.name, 'invoice_line_ids': self._prepare_invoice_line() }) return invoice
额外优化建议
- Odoo中one2many/many2many字段的写入采用ORM三元组命令,
(0, 0, 字典)代表新建一条关联记录,需要创建N条行就传入N个对应三元组到列表中即可。 - 不建议硬编码
journal_id的ID值,不同环境的日记帐ID可能不一致,建议通过代码过滤对应类型的销售日记帐再取ID,兼容性更高。 - 发票的
amount_untaxed等合计字段不需要手动赋值,Odoo会根据发票行数据自动计算,手动赋值反而可能出现和行合计不一致的异常。
内容的提问来源于stack exchange,提问作者SH EB
相关产品推荐
相关产品推荐

