Odoo 14 为hr.employee.public新增字段触发列不存在报错的问题咨询
Odoo 为hr.employee.public新增字段报错列不存在的解决方法
报错根本原因
hr.employee.public 并非映射独立业务存储表的常规模型,它是HR模块设计的权限隔离代理模型:
- 模型本身没有独立的数据库写权限,所有数据从
hr.employee主表通过权限过滤规则透传读取 - 若直接照搬给
hr.employee加字段的逻辑,在hr.employee.public模型类里直接声明onboarding_date字段,系统不会自动完成字段映射,生成查询SQL时会用代理表别名emp拼接不存在的onboarding_date列,最终触发psycopg2.ProgrammingError报错
完整实现两个表单同步展示字段的操作步骤
1. 在主存储模型定义业务字段
所有员工相关的业务字段都需要先在真正持有数据库存储权限的hr.employee模型上定义,这是后续所有操作的基础:
from odoo import fields, models class HrEmployee(models.Model): _inherit = 'hr.employee' onboarding_date = fields.Date(string='入职引导日期')
这一步完成后升级模块,Odoo会自动在hr_employee主表中创建onboarding_date对应的数据库列。
2. 显式将字段透传到hr.employee.public代理模型
在hr.employee.public模型中声明字段映射,不要重复定义无关联的空字段:
class HrEmployeePublic(models.Model): _inherit = 'hr.employee.public' onboarding_date = fields.Date( related='employee_id.onboarding_date', store=True, readonly=True )
- 用
related关联到主模型的同名字段,无需重复写业务逻辑 - 配置
store=True后系统会自动将主表字段值同步到代理模型的查询结构中,从根源避免列不存在的报错 - 配置
readonly=True适配公开模型的只读权限定位
3. 在两个目标表单视图中加载字段
通过视图继承的方式,分别给两个指定表单添加字段展示:
- 继承员工主编辑表单
hr.view_employee_form:
<record id="hr_employee_form_onboarding_extend" model="ir.ui.view"> <field name="name">hr.employee.form.onboarding.extend</field> <field name="model">hr.employee</field> <field name="inherit_id" ref="hr.view_employee_form"/> <field name="arch" type="xml"> <!-- 按需调整字段放置的组位置,示例为插入基本信息组 --> <group name="basic_info" position="inside"> <field name="onboarding_date"/> </group> </field> </record>
- 继承员工公开只读表单
hr.hr_employee_public_view_form:
<record id="hr_employee_public_form_onboarding_extend" model="ir.ui.view"> <field name="name">hr.employee.public.form.onboarding.extend</field> <field name="model">hr.employee.public</field> <field name="inherit_id" ref="hr.hr_employee_public_view_form"/> <field name="arch" type="xml"> <group name="public_basic_info" position="inside"> <field name="onboarding_date"/> </group> </field> </record>
排错注意事项
- 不要跳过主模型的字段定义步骤:直接在代理模型上定义孤立字段,没有主表列支撑,最终依然会触发查询报错
- 字段和视图变更必须通过模块升级流程生效:仅重启Odoo服务不会触发数据库结构更新和视图重载
- 若仍报列不存在错误,检查代理模型的字段映射配置:未显式关联的字段不会被纳入代理模型的查询范围
内容的提问来源于stack exchange,提问作者Jasoniem9246
相关产品推荐
相关产品推荐

