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
相关产品推荐
相关产品推荐

