Odoo:如何在account_move模型中获取关联的完整sale.order实例
问题描述
在Odoo的account_move模型中,存在一个名为invoice_origin的字段,该字段存储了销售订单(sale.order)的编号(如SO001这类名称标识),我需要获取对应的完整sale.order对象。由于两个模型未建立关联,请问如何在account_move的代码文件中搜索并返回完整的销售订单对象?
我尝试了以下代码但无法正常运行:
client_order_ref = fields.Char('get_sale_order().client_order_ref') # 获取对应invoice_origin字段的销售订单 def get_sale_order(self): sale_order = self.env['sale.order'].search([ ('name', '=', self.invoice_origin) ]) return sale_order
报错信息如下:
ERROR psycopg2.errors.UndefinedColumn: column account_move.client_order_ref does not exist LINE 1: ...ier_move_reference" as "supplier_move_reference", "account_m...
解决方案
你定义字段的方式完全不符合Odoo的规则,不能直接在字段声明里调用方法。要实现需求,有两种常用的正确方式:
方式1:定义计算字段获取销售订单的指定字段值
如果仅需要销售订单的client_order_ref字段值,可以直接定义计算字段:
client_order_ref = fields.Char(string='客户订单参考', compute='_compute_sale_order_fields') def _compute_sale_order_fields(self): for move in self: # 加limit=1避免匹配到多个结果(Odoo默认销售订单名称唯一,做兜底处理) sale_order = self.env['sale.order'].search([('name', '=', move.invoice_origin)], limit=1) move.client_order_ref = sale_order.client_order_ref if sale_order else False
方式2:定义关联字段直接获取完整销售订单对象
如果需要完整的sale.order对象,建议定义Many2one关联字段,通过计算关联到对应订单:
sale_order_id = fields.Many2one('sale.order', string='关联销售订单', compute='_compute_sale_order') def _compute_sale_order(self): for move in self: if move.invoice_origin: sale_order = self.env['sale.order'].search([('name', '=', move.invoice_origin)], limit=1) move.sale_order_id = sale_order.id if sale_order else False else: move.sale_order_id = False
定义完成后,你就可以通过self.sale_order_id直接调用完整的销售订单对象,比如self.sale_order_id.partner_id、self.sale_order_id.amount_total等字段都能直接访问。
关键注意点
- 调用
search时必须加limit=1,防止出现重复名称的销售订单导致数据异常。 - 要判断
invoice_origin是否为空,避免空值搜索引发不必要的错误。
内容的提问来源于stack exchange,提问作者odoo newbie
相关产品推荐
相关产品推荐

