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

