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
相关产品推荐
相关产品推荐

