Odoo17 Racing Teams模块Many2many字段员工层级独立设置问题
解决员工在不同Racing Teams中拥有独立层级的问题
问题根源在于你把tier_id定义为hr.employee的全局字段,导致员工的层级是统一的、跨团队共享的。要实现不同团队的独立层级,必须将层级信息存储在多对多关系的中间关联表中,而非员工模型本身。
步骤1:创建自定义中间关联模型
这个模型将存储团队、员工以及对应的层级信息,替代Odoo自动生成的默认关联表:
class RacingTeamsEmployeeRel(models.Model): _name = 'racing.teams.employee.rel' _description = 'Racing Teams & Employee Relation' team_id = fields.Many2one('racing.teams', string='Team', required=True, ondelete='cascade') employee_id = fields.Many2one('hr.employee', string='Employee', required=True, ondelete='cascade') tier_id = fields.Many2one('helpdesk.tier', string='Tier', required=True, ondelete='cascade') # 添加唯一约束,避免同一员工重复加入同一团队 _sql_constraints = [ ('team_employee_unique', 'unique(team_id, employee_id)', '员工不能重复加入同一团队!'), ]
步骤2:修改Racing Teams模型的多对多字段
更新employee_ids字段,指定使用上面创建的中间模型来关联员工:
class RacingTeams(models.Model): _name = "racing.teams" _description = "Racing Teams" _rec_name = 'name' name = fields.Char(string="Name", tracking=True) desc = fields.Char(string="Description", tracking=True) employee_ids = fields.Many2many( comodel_name='hr.employee', through='racing.teams.employee.rel', # 指定中间模型 column1='team_id', # 中间表中关联当前模型的字段 column2='employee_id', # 中间表中关联员工模型的字段 string='Employees', )
步骤3:调整XML视图,编辑中间表字段
修改视图,将tree视图的模型指定为中间关联模型,这样就能直接编辑每个员工在当前团队的层级:
<notebook> <page string="Team Member" name="team_member"> <field name="employee_ids" required="1"> <tree editable="top" model="racing.teams.employee.rel"> <field name="employee_id"/> <field name="tier_id"/> </tree> </field> </page> </notebook>
步骤4:清理员工模型的全局层级字段
删除hr.employee继承模型中的tier_id字段,因为层级信息不再是员工的全局属性:
class HelpdeskHR(models.Model): _inherit = "hr.employee" name = fields.Char(string="Employee Name", related='resource_id.name', store=True, readonly=False, tracking=False) # 移除原有的tier_id字段
原理说明
通过将层级字段移到多对多的中间关联表,每个「团队-员工」的组合都拥有独立的层级记录,修改某团队中员工的层级只会影响该关联记录,不会改变员工在其他团队的层级设置。
内容的提问来源于stack exchange,提问作者mhys
相关产品推荐
相关产品推荐

