求助:将sale.order的job_title_2字段同步至account.invoice
问题分析与解决方案
代码核心问题
- 类名与继承对象不匹配:继承
sale.order的类被命名为SaleOrderLine,混淆了主表与行表的概念,应改为SaleOrder;同理继承account.invoice的类命名为InvoiceLine不合理,建议改为AccountInvoice。 - 计算字段未关联方法:
job_title_2字段定义时未指定compute参数,导致@api.depends装饰的方法无法触发。 - 方法未归属目标类:
get_order方法未嵌套在AccountInvoice类内部,完全无法作用于发票对象。
正确实现方式
方式一:计算字段实时同步(推荐,自动同步销售订单字段变化)
from odoo import models, fields, api class SaleOrder(models.Model): _inherit = 'sale.order' job_title = fields.Char('Job Title') job_title_2 = fields.Char('Job Title 2') class AccountInvoice(models.Model): _inherit = 'account.invoice' job_title = fields.Char('Job Title') job_title_2 = fields.Char('Job Title 2', compute='_compute_job_title_2', store=True) @api.depends('sale_order_id.job_title_2') def _compute_job_title_2(self): for invoice in self: invoice.job_title_2 = invoice.sale_order_id.job_title_2 if invoice.sale_order_id else False
- 说明:
- 将计算方法嵌套在
AccountInvoice类内,通过compute参数绑定到job_title_2字段。 @api.depends指定依赖sale_order_id.job_title_2,销售订单的job_title_2变化时,发票字段会自动更新。store=True将计算结果存储到数据库,提升查询性能。
- 将计算方法嵌套在
方式二:创建发票时同步(仅在发票生成时复制一次)
如果不需要实时同步,仅在从销售订单生成发票时同步字段,可重写create方法:
from odoo import models, fields, api class SaleOrder(models.Model): _inherit = 'sale.order' job_title = fields.Char('Job Title') job_title_2 = fields.Char('Job Title 2') class AccountInvoice(models.Model): _inherit = 'account.invoice' job_title = fields.Char('Job Title') job_title_2 = fields.Char('Job Title 2') @api.model def create(self, vals): invoice = super(AccountInvoice, self).create(vals) if invoice.sale_order_id: invoice.write({ 'job_title': invoice.sale_order_id.job_title, 'job_title_2': invoice.sale_order_id.job_title_2 }) return invoice
额外注意事项
- 确保
account.invoice的sale_order_id关联字段正常(Odoo标准模块已默认提供)。 - 若需同步发票行(
account.invoice.line)与销售订单行的字段,需调整继承对象为account.invoice.line,并依赖sale_line_id字段。
内容的提问来源于stack exchange,提问作者Alwaysstuck
相关产品推荐
相关产品推荐

