Odoo自定义模块安装报错:ValueError: too many values to unpack (expected 2)
自定义Odoo模块安装报错解决
错误日志
RPC_ERROR Odoo Server Error Traceback (most recent call last): File "/usr/lib/python3/dist-packages/odoo/http.py", line 1584, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 133, in retrying result = func() File "/usr/lib/python3/dist-packages/odoo/http.py", line 1611, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "/usr/lib/python3/dist-packages/odoo/http.py", line 1815, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 154, in _dispatch result = endpoint(**request.params) File "/usr/lib/python3/dist-packages/odoo/http.py", line 697, in route_wrapper result = endpoint(self, *args, **params_ok) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 46, in call_button action = self._call_kw(model, method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 33, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 461, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 448, in _call_kw_multi result = method(recs, *args, **kwargs) File "<decorator-gen-74>", line 2, in button_immediate_install File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 74, in check_and_log return method(self, *args, **kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 468, in button_immediate_install return self._button_immediate_function(type(self).button_install) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 592, in _button_immediate_function registry = modules.registry.Registry.new(self._cr.dbname, update_module=True) File "<decorator-gen-14>", line 2, in new File "/usr/lib/python3/dist-packages/odoo/tools/func.py", line 87, in locked return func(inst, *args, **kwargs) File "/usr/lib/python3/dist-packages/odoo/modules/registry.py", line 90, in new odoo.modules.load_modules(registry, force_demo, status, update_module) File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 488, in load_modules processed_modules += load_marked_modules(cr, graph, File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 372, in load_marked_modules loaded, processed = load_module_graph( File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 208, in load_module_graph registry.init_models(cr, model_names, {'module': package.name}, new_install) File "/usr/lib/python3/dist-packages/odoo/modules/registry.py", line 531, in init_models env['ir.model.fields.selection']._reflect_selections(model_names) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_model.py", line 1287, in _reflect_selections expected = { File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_model.py", line 1291, in <dictcomp> for index, (value, label) in enumerate(field.selection) ValueError: too many values to unpack (expected 2) The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPCError@http://localhost:8069/web/assets/192-39f72eb/web.assets_backend.min.js:981:274 makeErrorFromResponse@http://localhost:8069/web/assets/192-39f72eb/web.assets_backend.min.js:985:163 jsonrpc/promise</<@http://localhost:8069/web/assets/192-39f72eb/web.assets_backend.min.js:993:34
模块models.py代码
# -*- coding: utf-8 -*- from odoo import models, fields, api class restaurante(models.Model): _name = 'trabajo_modulo.restaurante' _description = 'Define el restaurante' nombre = fields.Char('Nombre', required=True) nMesas = fields.Integer(string='Número de mesas', required=True) class mesa(models.Model): _name = 'trabajo_modulo.mesa' _description = 'Define la mesa' num = fields.Integer(string='Número', required = True) capacidad = fields.Integer(string='Capacidad', default=4) class empleado(models.Model): _name = 'trabajo_modulo.empleado' _description = 'Permite definir las características de un empleado' nombre = fields.Char('Nombre', required=True) nif = fields.Char('NIF', required=True) puesto = fields.Selection(string='Puesto', selection=[('w','Camarero'), ('c','Cocinero'), ('p', 'Repostero')], default='w') sueldo = fields.Float(string='Sueldo') fecha_incorporacion = fields.Date(string='Fecha de incorporación') experiencia = fields.Integer('Experiencia', compute='_get_antiguedad') @api.depends('fecha_incorporacion') def _get_antiguedad(self): for empleado in self: empleado.experiencia = 0
问题分析与解决
报错核心是ValueError: too many values to unpack (expected 2),说明Odoo在处理下拉选择字段(Selection)时,发现某个选项的元素数量不是预期的二元组(值+标签)。
排查与解决步骤:
- 检查当前代码的Selection字段:你的
puesto字段格式完全正确,每个选项都是('值', '标签')的二元组,注释该字段后仍报错,说明问题不在当前代码的字段定义里。 - 清理数据库残留记录:大概率是之前安装模块时,数据库中已经存储了错误的选择字段记录,即使修改了代码,Odoo更新时仍会读取旧数据。可以通过以下方式清理:
- 若能登录Odoo后台,先卸载该模块,重启服务后再重新安装。
- 若无法登录后台,直接执行SQL语句清理相关记录(需替换为你的数据库名):
DELETE FROM ir_model_fields_selection WHERE model LIKE 'trabajo_modulo.%'; DELETE FROM ir_model_fields WHERE model LIKE 'trabajo_modulo.%'; DELETE FROM ir_model WHERE model LIKE 'trabajo_modulo.%';
- 重启服务并重新安装:清理完成后,重启Odoo服务,再尝试安装模块。
额外建议:
- 模型类名建议使用驼峰式命名(比如
Restaurante而非restaurante),符合Odoo开发规范,避免潜在问题。 - 每次修改模块核心字段后,建议先卸载旧模块再重新安装,避免数据库数据残留导致的异常。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

