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

Odoo 11 CE:如何基于关联模型值过滤计算字段记录及薪资单修复

Odoo 11 CE 计算字段关联模型过滤问题解决方案

问题二:修复薪资单净支付金额显示错误

先帮你理清楚当前代码的问题:你查询hr.payslip.line时,只限定了code="NET",但没有关联到当前薪资单,所以每次都会返回系统中第一条符合code条件的记录,导致所有薪资单显示同一个值。

这里有两种修复方案,推荐第二种更高效的写法:

方案一:修正search查询条件

在查询domain中加入slip_id等于当前薪资单id的条件,确保只查询属于当前薪资单的记录:

class HrPayslip(models.Model):
    _name = "hr.payslip"
    _inherit = ['hr.payslip', 'mail.thread', 'mail.activity.mixin']
    net_pay = fields.Float(string='Net Pay', compute='_get_netpay')

    @api.multi
    def _get_netpay(self):
        for payslip in self:
            # 限定slip_id为当前薪资单id,同时过滤code=NET的记录
            net_line = self.env['hr.payslip.line'].search(
                [('slip_id', '=', payslip.id), ('code', '=', "NET")], 
                limit=1
            )
            # 处理找不到记录的情况,避免报错
            payslip.net_pay = net_line.amount if net_line else 0.0

方案二:利用关联字段直接过滤(推荐)

因为hr.payslip和hr.payslip.line是One2many关联,当前薪资单对象本身就有对应的薪资行集合(默认字段是payslip_line_ids),直接用这个字段过滤更高效,不需要额外查询数据库:

class HrPayslip(models.Model):
    _name = "hr.payslip"
    _inherit = ['hr.payslip', 'mail.thread', 'mail.activity.mixin']
    net_pay = fields.Float(string='Net Pay', compute='_get_netpay')

    @api.multi
    def _get_netpay(self):
        for payslip in self:
            # 从当前薪资单的关联行中过滤code=NET的记录
            net_line = payslip.payslip_line_ids.filtered(lambda l: l.code == "NET")
            payslip.net_pay = net_line.amount if net_line else 0.0

问题一:通用关联模型过滤方法

在Odoo中,要让计算字段基于关联模型的值过滤记录,核心是绑定当前记录与关联模型的关联关系,步骤如下:

  • 明确关联关系:比如当前模型A,关联模型B,B有外键字段(如a_id)指向A;
  • 在计算方法的循环中,针对每个当前记录rec,查询关联模型时必须加入外键等于rec.id的条件;
  • 优先使用当前记录的关联字段(One2many/Many2one)进行过滤,比env.search更高效且不易出错;
  • 处理空记录的边界情况,避免出现属性错误。

内容的提问来源于stack exchange,提问作者bennals

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:32:42