【问题标题】:Odoo How to solve return self.models[model_name]Odoo 如何解决返回 self.models[model_name]
【发布时间】:2020-06-05 15:28:40
【问题描述】:

我创建了 2 个自定义模块,“项目”和“实验室”。 实验室模块有一个2多个领域的项目。 项目模块有多个实验室id字段。

我对“实验室”模块进行了一些修改,当我尝试更新它时,我得到了这个错误:

Traceback (most recent call last):
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 624, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 310, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
  File "C:\Odoo13\Odoo 13.0\server\odoo\tools\pycompat.py", line 14, in reraise
    raise value
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 669, in dispatch
    result = self._call_function(**self.params)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 350, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\service\model.py", line 94, in wrapper
    return f(dbname, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 339, in checked_call
    result = self.endpoint(*a, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 915, in __call__
    return self.method(*args, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 515, in response_wrap
    response = f(*args, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\web\controllers\main.py", line 1326, in call_button
    action = self._call_kw(model, method, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\web\controllers\main.py", line 1314, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 387, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 374, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "<decorator-gen-65>", line 2, in button_immediate_upgrade
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 72, in check_and_log
    return method(self, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 634, in button_immediate_upgrade
    return self._button_immediate_function(type(self).button_upgrade)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 573, in _button_immediate_function
    modules.registry.Registry.new(self._cr.dbname, update_module=True)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 86, in new
    odoo.modules.load_modules(registry._db, force_demo, status, update_module)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 419, in load_modules
    force, status, report, loaded_modules, update_module, models_to_check)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 315, in load_marked_modules
    perform_checks=perform_checks, models_to_check=models_to_check
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 202, in load_module_graph
    registry.init_models(cr, model_names, {'module': package.name}, new_install)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 348, in init_models
    model._auto_init()
  File "C:\Odoo13\Odoo 13.0\server\odoo\models.py", line 2482, in _auto_init
    new = field.update_db(self, columns)
  File "C:\Odoo13\Odoo 13.0\server\odoo\fields.py", line 2417, in update_db
    comodel = model.env[self.comodel_name]
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 463, in __getitem__
    return self.registry[model_name]._browse(self, (), ())
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 177, in __getitem__
    return self.models[model_name]
KeyError: 'projects'

当我用谷歌搜索这个错误时,似乎我没有把我的模块“项目”的依赖项。

所以,下一步是放置依赖项:

# any module necessary for this one to work correctly
    'depends': ['base','mail','projects'],

现在我得到另一个错误,它是关于它自身的依赖:

Odoo Server Error
Traceback (most recent call last):
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 624, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 310, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
  File "C:\Odoo13\Odoo 13.0\server\odoo\tools\pycompat.py", line 14, in reraise
    raise value
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 669, in dispatch
    result = self._call_function(**self.params)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 350, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\service\model.py", line 94, in wrapper
    return f(dbname, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 339, in checked_call
    result = self.endpoint(*a, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 915, in __call__
    return self.method(*args, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\http.py", line 515, in response_wrap
    response = f(*args, **kw)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\web\controllers\main.py", line 1326, in call_button
    action = self._call_kw(model, method, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\web\controllers\main.py", line 1314, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 387, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 374, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "<decorator-gen-66>", line 2, in button_immediate_upgrade
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 72, in check_and_log
    return method(self, *args, **kwargs)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 634, in button_immediate_upgrade
    return self._button_immediate_function(type(self).button_upgrade)
  File "C:\Odoo13\Odoo 13.0\server\odoo\addons\base\models\ir_module.py", line 573, in _button_immediate_function
    modules.registry.Registry.new(self._cr.dbname, update_module=True)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 86, in new
    odoo.modules.load_modules(registry._db, force_demo, status, update_module)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 419, in load_modules
    force, status, report, loaded_modules, update_module, models_to_check)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 315, in load_marked_modules
    perform_checks=perform_checks, models_to_check=models_to_check
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\loading.py", line 176, in load_module_graph
    registry.setup_models(cr)
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 255, in setup_models
    model._setup_fields()
  File "C:\Odoo13\Odoo 13.0\server\odoo\models.py", line 2690, in _setup_fields
    field.setup_full(self)
  File "C:\Odoo13\Odoo 13.0\server\odoo\fields.py", line 431, in setup_full
    self._setup_regular_full(model)
  File "C:\Odoo13\Odoo 13.0\server\odoo\fields.py", line 2897, in _setup_regular_full
    comodel = model.env[self.comodel_name]
  File "C:\Odoo13\Odoo 13.0\server\odoo\api.py", line 463, in __getitem__
    return self.registry[model_name]._browse(self, (), ())
  File "C:\Odoo13\Odoo 13.0\server\odoo\modules\registry.py", line 177, in __getitem__
    return self.models[model_name]
KeyError: 'laboratory'

当我改变依赖并添加 self 模块时:

# any module necessary for this one to work correctly
    'depends': ['base','mail','projects','laboratory'],

我收到 500 内部服务器错误。

有人能解释一下为什么会发生这种情况以及我该如何处理吗?

【问题讨论】:

    标签: module dependencies odoo updates


    【解决方案1】:

    原因

    这是因为“循环依赖”。模块“项目”依赖于“实验室”。但是“实验室”依赖于“项目”,它变成了循环。结果,模块升级没有完成,没有添加字段,会显示KeyError。检查应用程序中的那些模块,这些模块只会被“取消升级”按钮卡住。我正在 odoo 11 上对此进行测试。

    修复

    我能想出几个办法来解决这个问题。

    • 将“项目”和“实验室”模型移至同一模块。
    • 改用“many2many”字段。
    • 创建另一个依赖于这两个模块的模块,并在此处通过继承定义“one2many”和“many2one”。
    • 通过继承将一个字段移动到另一个模块。我的意思是,例如继承“实验室”并在“项目”模块中添加“项目”字段。

    【讨论】:

    • 哦,现在我需要重写几乎所有内容((无论如何,谢谢您的解释。您能否也说明一下:每次我制作“one2many”之一时,我是否需要添加到依赖模块?或“many2one”或“many2many”字段?
    • 是的。如果您的关系字段(“one2many”、“many2one”、“many2many”)在另一个模块中使用模型,则需要将该模块添加为依赖项。在我上面的解决方案中,您需要添加除第一个之外的依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多