You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 13迁16后自定义模块因phone_validation模型缺失报错求助

解决Odoo 16中phone.validation.mixin不存在的迁移问题

问题背景

在Odoo 13中,自定义模块通过继承官方phone_validation模块的phone.validation.mixin实现手机号验证逻辑,代码如下:

from odoo import models

class PhoneValidationMixin(models.AbstractModel):
    _inherit = "phone.validation.mixin"

迁移至Odoo 16后,安装模块时触发TypeError: Model 'phone.validation.mixin' does not exist in registry.错误,原因是官方phone_validation模块已移除该抽象模型。

报错信息

Odoo Server Error
Traceback (most recent call last):
  File "/home/odoo/src/odoo/odoo/http.py", line 1584, in _serve_db
    return service_model.retrying(self._serve_ir_http, self.env)
  File "/home/odoo/src/odoo/odoo/service/model.py", line 133, in retrying
    result = func()
  File "/home/odoo/src/odoo/odoo/http.py", line 1611, in _serve_ir_http
    response = self.dispatcher.dispatch(rule.endpoint, args)
  File "/home/odoo/src/odoo/odoo/http.py", line 1815, in dispatch
    result = self.request.registry['ir.http']._dispatch(endpoint)
  File "/home/odoo/src/odoo/addons/website/models/ir_http.py", line 235, in _dispatch
    response = super()._dispatch(endpoint)
  File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 154, in _dispatch
    result = endpoint(**request.params)
  File "/home/odoo/src/odoo/odoo/http.py", line 697, in route_wrapper
    result = endpoint(self, *args, **params_ok)
  File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 46, in call_button
    action = self._call_kw(model, method, args, kwargs)
  File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 33, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/home/odoo/src/odoo/odoo/api.py", line 461, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "/home/odoo/src/odoo/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 "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 74, in check_and_log
    return method(self, *args, **kwargs)
  File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 456, in button_immediate_install
    return self._button_immediate_function(type(self).button_install)
  File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 580, in _button_immediate_function
    registry = modules.registry.Registry.new(self._cr.dbname, update_module=True)
  File "<decorator-gen-14>", line 2, in new
  File "/home/odoo/src/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
  File "/home/odoo/src/odoo/odoo/modules/registry.py", line 90, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/home/odoo/src/odoo/odoo/modules/loading.py", line 488, in load_modules
    processed_modules += load_marked_modules(cr, graph,
  File "/home/odoo/src/odoo/odoo/modules/loading.py", line 372, in load_marked_modules
    loaded, processed = load_module_graph(
  File "/home/odoo/src/odoo/odoo/modules/loading.py", line 197, in load_module_graph
    model_names = registry.load(cr, package)
  File "/home/odoo/src/odoo/odoo/modules/registry.py", line 247, in load
    model = cls._build_model(self, cr)
  File "/home/odoo/src/odoo/odoo/models.py", line 615, in _build_model
    raise TypeError("Model %r does not exist in registry." % name)
TypeError: Model 'phone.validation.mixin' does not exist in registry.

解决方案

方案1:改用OCA维护的phone_validation模块

OCA的server-ux仓库中维护了phone_validation模块,该模块在Odoo 16中保留了phone.validation.mixin抽象模型:

  • 安装OCA版本的phone_validation模块(替换官方同名模块)
  • 保持原有继承代码不变,确保自定义模块的__manifest__.py中依赖phone_validation

方案2:使用Odoo 16官方替代方案

官方在Odoo 16中将原mixin的功能拆分重构,可选择以下两种方式适配:

  • 继承官方新mixin:官方提供phone.normalizer.mixin作为替代,修改继承代码:
from odoo import models

class PhoneValidationMixin(models.AbstractModel):
    _inherit = "phone.normalizer.mixin"

注意:新mixin的方法名与原mixin有差异(如原_phone_format改为_phone_normalize),需适配业务代码中的方法调用。

  • 直接调用工具函数:如果仅需手机号格式化/验证逻辑,可直接导入官方工具函数:
from odoo.addons.phone_validation.tools import phone_validation

# 在需要的方法中调用
formatted_phone = phone_validation.phone_format(
    number=phone_number,
    country_code=country_code,
    country_id=country_id,
    raise_exception=False
)

内容的提问来源于stack exchange,提问作者Ahrimann Steiner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:37:35