You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动