diff --git a/odoo/addons/base/models/ir_module.py b/odoo/addons/base/models/ir_module.py index 0a48bfa834d..a05f4d50406 100644 --- a/odoo/addons/base/models/ir_module.py +++ b/odoo/addons/base/models/ir_module.py @@ -483,9 +483,9 @@ class Module(models.Model): tables, columns, constraints, etc. """ modules_to_remove = self.mapped('name') + self.env['ir.model.data']._module_data_uninstall(modules_to_remove) # we deactivate prefetching to not try to read a column that has been deleted self.with_context(prefetch_fields=False).write({'state': 'uninstalled', 'latest_version': False}) - self.env['ir.model.data']._module_data_uninstall(modules_to_remove) return True def _remove_copied_views(self): diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py index ca85b0834e3..9f74c010797 100644 --- a/odoo/modules/registry.py +++ b/odoo/modules/registry.py @@ -359,6 +359,11 @@ class Registry(Mapping): def _discard_fields(self, fields: list): """ Discard the given fields from the registry's internal data structures. """ + for f in fields: + # tests usually don't reload the registry, so when they create + # custom fields those may not have the entire dependency setup, and + # may be missing from these maps + self.field_depends.pop(f, None) # discard fields from field triggers self.__dict__.pop('_field_triggers', None)