Odoo继承hr.employee模型异常,审批人子模型保存数据异常求助
解决Odoo中One2many子记录自动覆盖关联字段的问题
看起来你遇到的是Odoo中One2many字段的默认行为导致的问题,我来帮你分析并解决:
问题根源
在Odoo中,当你定义one2many字段时,它会自动维护对应的many2one反向关联字段(也就是你代码里的employee_id),将其强制设置为当前打开的父记录(也就是你正在编辑的员工)。这是Odoo的默认关联机制,目的是确保子记录和父记录的关联关系正确,但这和你的需求冲突了——你希望手动选择employee_id为其他员工,而非被自动覆盖为当前员工。
解决方案:调整模型与视图结构
我们需要把反向关联字段和你要手动选择的员工字段拆分开,避免Odoo的自动填充影响你的选择:
1. 修正Python模型代码
修改hr_employee.py,重新定义模型字段,分离关联逻辑:
from odoo import fields, models, api, _ class Employees(models.Model): _inherit = 'hr.employee' # 将One2many的反向关联指向新的parent_employee_id字段 approvers = fields.One2many('hr.employee.approvers', 'parent_employee_id', string='Approvers') class EmployeeApprovers(models.Model): _name = 'hr.employee.approvers' _description = 'Employee Approvers' # 这个字段由Odoo自动填充,关联当前编辑的员工(父记录) parent_employee_id = fields.Many2one('hr.employee', string='Employee', required=True, ondelete='cascade') # 这个字段用来手动选择要分配的审批人(其他员工) approver_id = fields.Many2one('hr.employee', string='Approver', required=True) lower_limit = fields.Integer('Lower limit') upper_limit = fields.Integer('Upper limit')
2. 更新XML视图
对应调整视图,把原来的employee_id替换为新的approver_id字段:
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <record id="view_hr_employee_form_inherit" model="ir.ui.view"> <field name="name">hr.employee.form.inherit</field> <field name="model">hr.employee</field> <field name="inherit_id" ref="hr.view_employee_form"/> <field name="arch" type="xml"> <xpath expr="//page[@name='public']" position="inside"> <group string="Aprobadores"> <field name="approvers"> <tree string="Aprobadores" editable="bottom"> <!-- 替换为手动选择审批人的字段 --> <field name="approver_id"/> <field name="lower_limit"/> <field name="upper_limit"/> </tree> </field> </group> </xpath> </field> </record> </data> </odoo>
3. 效果验证
现在重新升级模块后:
- 打开任意员工表单添加审批人时,
parent_employee_id会自动关联当前员工(确保层级关系正确) - 你可以自由选择
approver_id为其他员工,保存后该值不会被覆盖 - 上下限字段也能正常保存生效
内容的提问来源于stack exchange,提问作者southernegro
相关产品推荐
相关产品推荐

