Odoo销售订单行产品供应商自动显示问题:自定义字段未生效
解决Odoo销售订单行自动显示产品对应供应商的问题
我看了你的代码,发现几个关键问题导致字段没生效,咱们一步步来修正:
1. 错误的模型继承方式
你继承sale.order.line时额外写了_name = 'sale.order.line',这会直接覆盖原模型而非扩展它。Odoo里继承模型只需要保留_inherit,去掉_name就能正确扩展原有模型了。
2. 计算字段缺少触发依赖
@api.depends()里是空的,Odoo不知道什么时候该重新计算字段值。因为你要根据产品关联供应商,必须把product_id加入依赖,这样选择产品时才会自动触发计算。
3. 供应商搜索逻辑完全错误
你用self.ids去搜索res.partner,但self.ids是销售订单行的ID,和供应商名称毫无关系。正确的做法是通过订单行的product_id关联到产品的供应商信息(seller_ids),再根据你的业务规则取特定供应商。
4. 未处理批量记录集
Odoo的compute方法接收的是记录集(可能包含多条订单行),不能直接给self.partner_name赋值,要循环每条记录单独处理。
修正后的代码
from odoo import models, fields, api class SaleOrderLine(models.Model): _inherit = 'sale.order.line' # 仅保留继承声明,删除_name # 若仅需显示名称用Char,若需关联供应商记录用Many2one更灵活 partner_name = fields.Char(string="特定供应商", compute='_compute_partner_name') # 可选:用Many2one字段方便后续业务操作 # partner_id = fields.Many2one('res.partner', string="特定供应商", compute='_compute_partner_name') @api.depends('product_id') # 添加依赖字段,触发自动计算 def _compute_partner_name(self): for line in self: # 这里默认取产品的第一个供应商,可根据你的业务规则调整筛选逻辑 if line.product_id and line.product_id.seller_ids: line.partner_name = line.product_id.seller_ids[0].name # 若用Many2one字段则赋值: # line.partner_id = line.product_id.seller_ids[0].partner_id else: line.partner_name = "" # 无供应商时显示空值
额外提示
- 如果你的“特定供应商”有业务规则(比如优先级最高、特定类型的供应商),可以给
seller_ids加筛选条件,比如:# 假设你给供应商信息加了is_primary标记优先级 target_seller = line.product_id.seller_ids.filtered(lambda s: s.is_primary) if target_seller: line.partner_name = target_seller[0].name - 最后别忘了在销售订单行的视图(树形/表单视图)里添加这个字段,比如在视图XML中加入
<field name="partner_name"/>,不然前端看不到新增的字段哦!
内容的提问来源于stack exchange,提问作者alyaa




