Odoo 16中扩展pos.config字段并继承_loader_params_pos_config方法时报错求助
大家好,我在Odoo 16里尝试给pos.config添加自定义字段restrict_create_customer,同时继承pos.session的_loader_params_pos_config方法,把这个字段加载到POS会话中,结果触发了如下错误:
TypeError: unsupported operand type(s) for +=: 'builtin_function_or_method' and 'list'
我的Python代码如下:
from odoo import models, fields class PosConfigInherit(models.Model): _inherit = 'pos.config' restrict_create_customer = fields.Boolean(help="Show employee login screen") class ConfigSettingsInherit(models.TransientModel): _inherit = 'res.config.settings' pos_module_restrict_create = fields.Boolean(related='pos_config_id.restrict_create_customer', readonly=False) class PosSession(models.Model): _inherit = 'pos.session' def _loader_params_pos_config(self): result = super()._loader_params_pos_config() result['search_params']['fields'].append('restrict_create_customer') return result
可能的错误原因及解决办法:
模块依赖未配置
一定要确保你的模块__manifest__.py里添加了'depends': ['point_of_sale'],毕竟pos.config和pos.session都是point_of_sale模块下的模型,没有依赖的话很容易出现继承异常或者字段加载失败的问题。检查返回结果的结构
在Odoo 16中,_loader_params_pos_config返回的search_params里的fields应该是一个列表。如果调用super()后拿到的result结构不对,比如fields变成了方法而非列表,就会触发这个错误。可以先打印result确认结构:def _loader_params_pos_config(self): result = super()._loader_params_pos_config() print(result) # 打印查看结构是否符合预期 result['search_params']['fields'].append('restrict_create_customer') return result如果确认
fields不是列表,也可以改用列表拼接的方式:result['search_params']['fields'] = result['search_params']['fields'] + ['restrict_create_customer']确认字段已成功创建
先升级模块,然后在开发者模式下查看pos.config的字段列表,确认restrict_create_customer字段已经存在。如果字段没创建成功,后续的加载自然会出错。检查继承的正确性
确认PosSession类的_inherit = 'pos.session'没有拼写错误,并且你的模块已经被正确安装到系统中。
额外建议:
如果上面的方法都没解决问题,可以试试清除Odoo缓存,重启服务后再重新升级模块,有时候缓存会导致继承的方法没有被正确加载。
备注:内容来源于stack exchange,提问作者Abdullah Elshoura

