¿Cómo puedo eliminar una clase de modelo de Odoo sin eliminar todo el módulo completo?
Tengo un módulo con una clase de modelo que me gustaría eliminar porque ya no es necesaria, pero otros modelos en el módulo siguen siendo importantes. Puedo eliminar todos los demás archivos que hacen referencia al modelo innecesario sin ningún error (seguridad CSV, vistas, archivos de datos, etc…), pero cuando finalmente elimino la referencia al archivo real que contiene la clase en sí (comento from . import model_name
en models/__init__.py
), obtengo el siguiente error:
odoo-server | Traza de error más reciente:
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/modules/registry.py", línea 60, en nuevo
odoo-server | return cls.registros[nombre_bd]
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/tools/func.py", línea 69, en envoltura
odoo-server | return func(self, *args, **kwargs)
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/tools/lru.py", línea 44, en obtener
odoo-server | a = self.d[obj].yo
odoo-server | KeyError: 'nombre_de_bd'
odoo-server | Durante el manejo de la excepción anterior, se produjo otra excepción:
odoo-server | Traza de error más reciente:
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/modules/registry.py", línea 86, en nuevo
odoo-server | odoo.modules.load_modulos(registro.bd, forzar_demo, estado, actualizar_modulo)
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/modules/loading.py", línea 477, en cargar_modulos
odoo-server | env['ir.model.data'].procesar_fin(modulos_procesados)
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_model.py", línea 2040, en procesar_fin
odoo-server | registro.borrar()
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_model.py", línea 1217, en borrar
odoo-server | if not self.env[seleccion.field_id.modelo].abstract:
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/api.py", línea 466, en obteneritem
odoo-server | return self.registry[nombre_de_modelo].navegar(self, (), ())
odoo-server | Archivo "/usr/lib/python3/dist-packages/odoo/modules/registry.py", línea 176, en obteneritem
odoo-server | return self.modelos[nombre_de_modelo]
odoo-server | KeyError: 'nombre_de_modelo'
¿Por qué no puedo simplemente eliminar la referencia al archivo que contiene la clase? ¿Cómo puedo eliminar un modelo sin desinstalar el módulo completo?
davy.ai
Cuando eliminas la referencia al archivo que contiene la clase en
models/__init__.py
, Odoo seguirá intentando cargar el modelo durante el proceso de inicio. Dado que el archivo ya no está presente, Odoo generará un error y no podrá iniciar. Es por eso que verás elKeyError
en el registro.Para eliminar un modelo sin desinstalar todo el módulo, debes seguir los siguientes pasos:
models/model_name.py
.ir.model
, registrosir.model.fields
, etc.). Esto se puede hacer utilizando la API de Modelos de Odoo o ejecutando una consulta SQL directamente en la base de datos.models/__init__.py
.Una vez que hayas completado estos pasos, deberías poder eliminar el modelo de tu módulo de forma segura sin causar ningún error.