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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:28:01