You need to enable JavaScript to run this app. Odoo 14 为hr.employee.public新增字段触发列不存在报错的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 08:54:06