You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo升级模块时自定义字段未覆盖核心模块默认设置问题

解决Odoo升级时核心模块覆盖自定义字段必填属性的问题

问题原因

这是Odoo模块加载机制导致的:升级过程中系统会优先重新加载核心project模块,此时project.project的company_id字段会被重置为默认的必填状态;而你的自定义模块要等核心模块加载完成后才会执行字段修改逻辑,因此在核心模块加载阶段看不到自定义配置的效果,升级完成后才会生效。

解决方案

方案1:调整自定义模块加载顺序

在自定义模块的__manifest__.py中,明确依赖project模块并设置更高的加载顺序值(确保在核心模块之后执行):

'depends': ['project'],
'sequence': 20,  # 核心project模块默认sequence为10,设为更大的值保证后置加载

这样核心模块加载完成后,自定义模块会立刻执行字段修改,缩短状态不一致的窗口。

方案2:强制覆盖核心字段定义(Odoo 14+)

通过字段继承机制,在自定义模块中重新定义company_id字段并添加override=True参数,强制覆盖核心模块的字段配置:

from odoo import models, fields

class ProjectProject(models.Model):
    _inherit = 'project.project'

    company_id = fields.Many2one(
        'res.company',
        string='Company',
        required=False,
        override=True,  # 强制覆盖核心字段的原有定义
        default=lambda self: self.env.company
    )

该参数会让Odoo在加载字段时直接使用自定义模块的配置,避免核心模块加载时重置属性。注意保持字段其他属性(如default、string)与核心模块一致,避免引入额外问题。

方案3:通过钩子函数强制修正字段属性

定义安装/升级后钩子函数,在模块加载完成后立即更新字段的必填状态:

from odoo import api, SUPERUSER_ID

def _fix_company_id_required(cr, registry):
    env = api.Environment(cr, SUPERUSER_ID, {})
    company_field = env['ir.model.fields'].search([
        ('model', '=', 'project.project'),
        ('name', '=', 'company_id')
    ])
    if company_field:
        company_field.write({'required': False})

def post_install_hook(cr, registry):
    _fix_company_id_required(cr, registry)

def post_upgrade_hook(cr, registry):
    _fix_company_id_required(cr, registry)

然后在__manifest__.py中注册钩子:

'post_init_hook': 'post_install_hook',
'post_upgrade_hook': 'post_upgrade_hook',

此方法会在首次安装或每次升级后,强制修正字段属性,确保最终状态符合预期。

内容的提问来源于stack exchange,提问作者Alesis Joan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:18:20