尽管添加了依赖项,但仍出现 KeyError

问题描述 投票:0回答:1

我最近安装了保险管理模块,并正在尝试增强其功能。我的目标是在 CRM 潜在客户笔记本中添加一个页面来显示为每个潜在客户创建的保险。

但是,每次尝试升级 CRM 或保险管理模块时,我都会遇到错误。以下是我添加的代码:

CRM 模块中的

crm_lead.py:

from odoo import models, fields

class Lead(models.Model):
    _name = "crm.lead"
    _description = "Lead/Opportunity"
    _order = "priority desc, id desc"
    _inherit = ['mail.thread.cc', 'mail.thread.blacklist', 'mail.thread.phone', 'mail.activity.mixin', 'utm.mixin', 'format.address.mixin']

    insurance_ids = fields.One2many('insurance.details', 'crm_lead_ref', string='Insurances', required=True, store=True)

    def create_insurance_action(self):
        return {
            'name': 'Create Insurance',
            'type': 'ir.actions.act_window',
            'res_model': 'insurance.details',
            'view_mode': 'form',
            'target': 'new',
            'context': {
                'default_partner_id': self.partner_id.id,
                'default_lead_id': self.id
            },
            'views': [(False, 'form')],
            'view_id': False,
        }
保险管理模块中的

insurance_details.py:

from odoo import models, fields

class InsuranceDetails(models.Model):
    _name = 'insurance.details'
    _inherit = ["mail.thread"]

    crm_lead_ref = fields.Many2one('crm.lead', string='CRM Lead Reference', help="Reference to the CRM lead from which this insurance was created.", required=True, store=True)

    def create(self, vals):
        if vals.get('name', 'New') == 'New':
            vals['name'] = self.env['ir.sequence'].next_by_code('insurance.details') or 'New'
        
        crm_lead_ref = self.env.context.get('default_crm_lead_ref')
        if crm_lead_ref:
            vals['crm_lead_ref'] = crm_lead_ref
        
        new_record = super(InsuranceDetails, self).create(vals)
        return new_record
保险模块中的

manifest.py

{
    'name': 'Insurance Management',
    'version': '16.0.1.1.1',
    'summary': """Insurance Management & Operations""",
    'description': """Insurance Management""",
    'author': 'Cybrosys Techno Solutions',
    'company': 'Cybrosys Techno Solutions',
    'category': 'Industries',
    'depends': ['crm', 'account', 'base'],
    'license': 'AGPL-3',
    'data': [
        'security/ir.model.access.csv',
        'data/insurance_management_data.xml',
        'views/claim_details_views.xml',
        'views/employee_details_views.xml',
        'views/insurance_details_views.xml',
        'views/policy_details_views.xml',
        'views/insurance_management_menus.xml'
    ],
}

crm_lead_views.xml:

                <page string="Insurances">
                    <field name="insurance_ids">
                         <tree>
                        </tree>
                    </field>
                </page> 

我已将带有 One2many 字段的 crm.lead 模型扩展到 Insurance.details,并且在 Insurance.details 中也有相应的 Many2one 字段。尽管进行了这些配置,我在模块升级过程中仍然遇到错误。


RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
  File "/Users/kamil/work/odoo/odoo/service/model.py", line 133, in retrying
    result = func()
             ^^^^^^
  File "/Users/kamil/work/odoo/odoo/http.py", line 1618, in _serve_ir_http
    response = self.dispatcher.dispatch(rule.endpoint, args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/http.py", line 1822, in dispatch
    result = self.request.registry['ir.http']._dispatch(endpoint)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/addons/base/models/ir_http.py", line 154, in _dispatch
    result = endpoint(**request.params)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/http.py", line 697, in route_wrapper
    result = endpoint(self, *args, **params_ok)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/addons/web/controllers/dataset.py", line 46, in call_button
    action = self._call_kw(model, method, args, kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/addons/web/controllers/dataset.py", line 33, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/api.py", line 466, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/api.py", line 453, in _call_kw_multi
    result = method(recs, *args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<decorator-gen-83>", line 2, in button_immediate_upgrade
  File "/Users/kamil/work/odoo/odoo/addons/base/models/ir_module.py", line 74, in check_and_log
    return method(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/addons/base/models/ir_module.py", line 659, in button_immediate_upgrade
    return self._button_immediate_function(type(self).button_upgrade)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/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-16>", line 2, in new
  File "/Users/kamil/work/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 90, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/Users/kamil/work/odoo/odoo/modules/loading.py", line 484, in load_modules
    processed_modules += load_marked_modules(cr, graph,
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/loading.py", line 372, in load_marked_modules
    loaded, processed = load_module_graph(
                        ^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/loading.py", line 207, in load_module_graph
    registry.setup_models(cr)
  File "<decorator-gen-19>", line 2, in setup_models
  File "/Users/kamil/work/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 298, in setup_models
    model._setup_fields()
  File "/Users/kamil/work/odoo/odoo/models.py", line 2813, in _setup_fields
    field.setup(self)
  File "/Users/kamil/work/odoo/odoo/fields.py", line 538, in setup
    self.setup_nonrelated(model)
  File "/Users/kamil/work/odoo/odoo/fields.py", line 4332, in setup_nonrelated
    invf = comodel._fields[self.inverse_name]
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'crm_lead_ref'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 64, in __new__
    return cls.registries[db_name]
           ~~~~~~~~~~~~~~^^^^^^^^^
  File "<decorator-gen-8>", line 2, in __getitem__
  File "/Users/kamil/work/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/tools/lru.py", line 34, in __getitem__
    a = self.d[obj]
        ~~~~~~^^^^^
KeyError: 'odoo'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/kamil/work/odoo/odoo/http.py", line 1591, in _serve_db
    return service_model.retrying(self._serve_ir_http, self.env)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/service/model.py", line 167, in retrying
    env.reset()
  File "/Users/kamil/work/odoo/odoo/api.py", line 501, in reset
    self.transaction.reset()
  File "/Users/kamil/work/odoo/odoo/api.py", line 887, in reset
    self.registry = Registry(self.registry.db_name)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 66, in __new__
    return cls.new(db_name)
           ^^^^^^^^^^^^^^^^
  File "<decorator-gen-16>", line 2, in new
  File "/Users/kamil/work/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 90, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/Users/kamil/work/odoo/odoo/modules/loading.py", line 510, in load_modules
    registry.setup_models(cr)
  File "<decorator-gen-19>", line 2, in setup_models
  File "/Users/kamil/work/odoo/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/kamil/work/odoo/odoo/modules/registry.py", line 298, in setup_models
    model._setup_fields()
  File "/Users/kamil/work/odoo/odoo/models.py", line 2813, in _setup_fields
    field.setup(self)
  File "/Users/kamil/work/odoo/odoo/fields.py", line 538, in setup
    self.setup_nonrelated(model)
  File "/Users/kamil/work/odoo/odoo/fields.py", line 4332, in setup_nonrelated
    invf = comodel._fields[self.inverse_name]
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'crm_lead_ref'

The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
    RPCError@http://localhost:8069/web/assets/963-81d456c/web.assets_backend.min.js:987:274
    makeErrorFromResponse@http://localhost:8069/web/assets/963-81d456c/web.assets_backend.min.js:991:163
    jsonrpc/promise</<@http://localhost:8069/web/assets/963-81d456c/web.assets_backend.min.js:999:34

任何有关可能导致此问题的原因或如何解决此问题的见解或建议将不胜感激

odoo keyerror odoo-16
1个回答
0
投票

这是继承模型的正确方式;您当前继承模块的方法是不正确的。

class Lead(models.Model):
    _inherit = 'crm.lead'

    insurance_ids = fields.One2many('insurance.details', 'crm_lead_id', string='Insurances', required=True, store=True)

    def create_insurance_action(self):
        return {
            'name': 'Create Insurance',
            'type': 'ir.actions.act_window',
            'res_model': 'insurance.details',
            'view_mode': 'form',
            'target': 'new',
            'context': {
                'default_partner_id': self.partner_id.id,
                'default_crm_lead_id': self.id
            },
            'views': [(False, 'form')],
            'view_id': False,
        }

接下来,您需要在 comodel(“insurance.details”)中以反向字段(“crm_lead_id”)的名称创建一个 may2one 字段,以便在模型“crm.details”中使用 One2many 字段 Insurance_ids。潜在客户”,带有反向字段“crm_lead_id。”

class InsuranceDetails(models.Model):
    _name = 'insurance.details'

    crm_lead_id = fields.Many2one('crm.lead') 

    @api.model
    def create(self, vals):
        if vals.get('name', 'New') == 'New':
            vals['name'] = self.env['ir.sequence'].next_by_code(
                'insurance.details') or 'New'
        crm_lead_id = self.env.context.get('default_crm_lead_id')
        if crm_lead_id:
            vals['crm_lead_id'] = crm_lead_id
        return super(InsuranceDetails, self).create(vals)

最后,重写给定的创建方法。

© www.soinside.com 2019 - 2024. All rights reserved.