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

Odoo中如何获取并使用另一关联模型中已有的字段值?

是否需要用计算字段实现?

是的,推荐使用计算字段实现。由于yearly_holidays_ids是一对多字段,对应多条hr.employee.yearly.holidays记录,无法直接通过关联(related)字段直接获取聚合值/指定单条记录值,计算字段是最灵活且易维护的实现方式。

具体操作步骤

  1. 在hr.employee的继承模型中新增计算字段,通过api.depends指定依赖的关联字段,保证关联数据更新时自动同步取值。
  2. 在计算方法中按业务需求处理remaining_count的取值逻辑(求和/取特定年份值等)。

代码示例

from odoo import models, fields, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    # 你已定义的一对多关联字段
    yearly_holidays_ids = fields.One2many('hr.employee.yearly.holidays', 'employee_id')
    # 新增计算字段:示例为统计所有年度剩余年假总和
    total_remaining_holidays = fields.Integer(
        string='总剩余年假天数',
        compute='_compute_total_remaining_holidays',
        store=True # 若需要用于列表视图过滤、分组统计,或降低实时计算开销可开启
    )
    # 可选新增:仅取当前年度的剩余年假
    current_year_remaining_holidays = fields.Integer(
        string='本年度剩余年假天数',
        compute='_compute_current_year_remaining_holidays',
        store=True
    )

    @api.depends('yearly_holidays_ids.remaining_count')
    def _compute_total_remaining_holidays(self):
        for employee in self:
            employee.total_remaining_holidays = sum(
                employee.yearly_holidays_ids.mapped('remaining_count')
            )

    @api.depends('yearly_holidays_ids.remaining_count', 'yearly_holidays_ids.year')
    def _compute_current_year_remaining_holidays(self):
        current_year = fields.Date.today().year
        for employee in self:
            current_year_holiday = employee.yearly_holidays_ids.filtered(lambda x: x.year == current_year)
            employee.current_year_remaining_holidays = current_year_holiday.remaining_count if current_year_holiday else 0

注意事项

  • 若关闭store=True,字段值会在每次调用时实时计算,无需额外存储空间,但大数量级下查询效率会降低
  • 依赖的remaining_count本身是存储型计算字段,修改其计算逻辑后需要手动升级模块触发数据重算,同步更新hr.employee侧的存储型计算字段值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:18:03