Odoo 11中扩展mrp.production模型state字段遇问题求助
解决Odoo 11中扩展MRP Production State字段的问题
在Odoo 11里你遇到的AttributeError: 'mrp.production' object has no attribute '_columns',核心原因是新ORM API已经完全取代了旧API的字段定义逻辑:_columns是Odoo 7及更早版本的旧API属性,在Odoo 11中已经被_fields取代,而且直接重写__init__方法来修改字段也不是新API推荐的实现方式。
下面给你两种正确的解决方案:
方法1:直接通过字段继承扩展(推荐)
Odoo 11+提供了简洁的方式来扩展selection字段,只需要在继承模型时重新定义该字段,使用selection_add参数添加新选项即可,Odoo会自动合并原有选项和新选项:
from odoo import models, fields import logging _logger = logging.getLogger(__name__) class MrpProduction(models.Model): _inherit = 'mrp.production' state = fields.Selection( selection_add=[('other_state', 'My State')], # 可选:定义当该选项被删除时的处理行为,比如设置为默认值 ondelete={'other_state': 'set default'} )
这种方式代码简洁、符合Odoo新API的设计规范,不需要手动处理原有选项的合并逻辑。
方法2:动态添加选项(适用于复杂逻辑场景)
如果你的需求需要动态判断是否添加新选项(比如根据特定条件),可以通过模型的_fields属性操作,但要在_setup_fields方法中执行(这是Odoo新API中字段初始化的合适时机),而不是重写__init__:
from odoo import models, fields import logging _logger = logging.getLogger(__name__) class MrpProduction(models.Model): _inherit = 'mrp.production' def _setup_fields(self): # 先执行父类的字段初始化逻辑 super(MrpProduction, self)._setup_fields() # 获取原有的state选项列表 current_states = self._fields['state'].selection new_state = ('other_state', 'My State') # 检查新选项是否已存在,不存在则添加 if new_state not in current_states: # 注意:selection是元组,需要转成列表修改后再转回元组 updated_states = list(current_states) updated_states.append(new_state) self._fields['state'].selection = tuple(updated_states) _logger.debug('Successfully extended mrp.production state with: other_state')
为什么原代码报错?
_columns属性已被移除:Odoo 11全面使用新ORM API,旧API的_columns属性不再存在,新API中字段定义存储在_fields属性中。- 重写
__init__不适合新API:新API中模型的初始化逻辑已经重构,__init__方法不再是修改字段定义的合适时机,_setup_fields才是处理字段初始化扩展的正确钩子。
内容的提问来源于stack exchange,提问作者wodka
相关产品推荐
相关产品推荐

