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

Odoo 10自定义模块字段获取:无继承取值与hr.contract取值

解决Odoo 10中的两个字段取值问题

我来帮你一步步搞定这两个需求:

1. 无需继承模型,将单个字段值获取到自定义模块

首先,你提供的现有代码其实已经是一种无需继承hr.contract模型的合理方案——通过Many2one关联+related字段来同步单个关联合同的date_start值,完全符合Odoo的ORM设计逻辑:

contract = fields.Many2one('hr.contract', string="Related Contract")
join_date = fields.Date(string="Hire date", related='contract.date_start', store=True, readonly=True)

这种方式不需要你继承hr.contract模型本身,只是让自定义模型和它建立关联关系,用户手动选择合同后就能自动同步日期,非常实用。

如果你的场景是不需要建立关联,只想直接获取某一条特定合同的字段值(比如固定取最新创建的合同),那可以用计算字段来实现:

from odoo import models, fields

class CustomModel(models.Model):
    _name = 'custom.model'
    _description = 'Custom Model'

    latest_contract_start = fields.Date(string="Latest Contract Start Date", compute='_compute_latest_contract_start', store=True)

    def _compute_latest_contract_start(self):
        for rec in self:
            # 取最新创建的合同记录
            latest_contract = self.env['hr.contract'].search([], limit=1, order='create_date desc')
            rec.latest_contract_start = latest_contract.date_start if latest_contract else False

你也可以把查询条件改成指定合同ID,比如用self.env['hr.contract'].browse(123)来获取ID为123的合同的date_start值。

2. 获取hr.contract所有已保存记录的date_start字段值

如果要拿到所有hr.contract记录的date_start值,直接用Odoo的ORM查询就可以,下面给你两种常用场景的实现:

场景1:在模型方法中获取日期列表

如果是在自定义模型的业务逻辑中需要用到所有日期,可以写一个方法来查询:

from odoo import models

class CustomModel(models.Model):
    _name = 'custom.model'
    _description = 'Custom Model'

    def get_all_contract_start_dates(self):
        # 查询所有已保存的合同,只提取date_start字段
        contract_data = self.env['hr.contract'].search_read([], ['date_start'])
        # 整理成纯日期列表(过滤掉空值)
        date_list = [item['date_start'] for item in contract_data if item['date_start']]
        return date_list

调用这个方法就能得到所有非空的date_start值列表,要是需要同时获取合同ID或其他字段,只要在search_read的第二个参数里加上对应的字段名就行。

场景2:在视图中展示所有日期

如果想在自定义模型的视图里直观展示所有合同的起始日期,可以用计算字段把日期拼接成字符串:

from odoo import models, fields

class CustomModel(models.Model):
    _name = 'custom.model'
    _description = 'Custom Model'

    all_contract_dates = fields.Char(string="All Contract Start Dates", compute='_compute_all_contract_dates')

    def _compute_all_contract_dates(self):
        for rec in self:
            contracts = self.env['hr.contract'].search([])
            # 把日期转成字符串格式,用逗号分隔
            date_strings = [contract.date_start.strftime('%Y-%m-%d') for contract in contracts if contract.date_start]
            rec.all_contract_dates = ', '.join(date_strings) if date_strings else 'No contracts found'

重要提示

别忘了在自定义模块的__manifest__.py里添加'depends': ['hr_contract'],这样才能正常访问hr.contract模型,避免出现找不到模型的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:12:21