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

Odoo原型继承实现问题:继承crm.lead时遇异常

Odoo 模型继承与视图异常排查

问题背景

未完全掌握Odoo继承机制,尝试继承crm.lead模型编写了Model与View代码,但运行后出现异常。

Model代码

class learn_odoo(models.Model):
    _name = 'learn_odoo.learn_odoo'
    _inherit = ['crm.lead']
    _description = 'learn_odoo.learn_odoo'
    tag_ids = fields.Many2many('mail.channel','mail_channel_profile_crm', 'partner_id', 'tag_id')
    job = fields.Char()

View代码

<record id="view_inherit_list_crm" model="ir.ui.view">
    <field name="name">Learn Odoo</field>
    <field name="model">learn_odoo.learn_odoo</field>
    <field eval="1" name="priority"/>
    <field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/>
    <field name="arch" type="xml">
        <xpath expr="//field[@name='name']" position="after">
            <field name="job"/>
        </xpath>
    </field>
</record>

<record id="learn_odoo.action_window" model="ir.actions.act_window">
    <field name="name">Learn Odoo</field>
    <field name="type">ir.actions.act_window</field>
    <field name="res_model">learn_odoo.learn_odoo</field>
    <field name="view_mode">tree,form</field>
    <field name="help" type="html">
        <p class="oe_view_nocontent_create">
        </p>
        <p>
        </p>
    </field>
</record>

异常信息(翻译后)

模型learn_odoo.learn_odoo中不存在字段id

问题分析与解决方案

核心问题1:继承类型错误

你当前同时指定_name和_inherit,使用的是委托继承,这种方式会创建全新模型,通过关联字段crm_lead_id绑定原crm.lead记录,而非直接扩展原模型的字段。但你继承的视图依赖crm.lead的原生字段(如id),新模型并不直接拥有这些字段,因此触发报错。

核心问题2:视图继承对象不匹配

视图继承的inherit_id指向crm.crm_case_tree_view_oppor,该视图的关联模型是crm.lead,但你的视图指定模型为learn_odoo.learn_odoo,两者模型不匹配,Odoo无法解析继承关系。

解决方案(根据需求二选一)

方案1:扩展原crm.lead模型(经典继承)

如果需求是在原CRM线索模型上新增字段,而非创建新模型,修改Model代码:

class CrmLeadInherit(models.Model):
    _inherit = 'crm.lead'
    _description = '扩展CRM线索模型'
    tag_ids = fields.Many2many('mail.channel','mail_channel_profile_crm', 'partner_id', 'tag_id')
    job = fields.Char()

同时修改View代码的关联模型:

<record id="view_inherit_list_crm" model="ir.ui.view">
    <field name="name">扩展CRM线索列表</field>
    <field name="model">crm.lead</field>
    <field eval="1" name="priority"/>
    <field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/>
    <field name="arch" type="xml">
        <xpath expr="//field[@name='name']" position="after">
            <field name="job"/>
        </xpath>
    </field>
</record>

此方案无需单独创建动作窗口,新增字段会直接显示在原CRM线索的视图中。

方案2:正确配置委托继承视图

如果确实需要创建新模型,需调整视图结构,通过委托字段访问原模型内容:

  1. 委托继承会自动生成crm_lead_id字段,用于关联原crm.lead记录
  2. 修改视图为非继承模式,直接定义结构:
<record id="learn_odoo_tree_view" model="ir.ui.view">
    <field name="name">Learn Odoo 列表视图</field>
    <field name="model">learn_odoo.learn_odoo</field>
    <field name="arch" type="xml">
        <tree>
            <field name="crm_lead_id" string="关联线索"/>
            <field name="job"/>
            <!-- 如需显示原模型字段,使用 crm_lead_id.字段名 格式 -->
            <field name="crm_lead_id.name"/>
        </tree>
    </field>
</record>

<record id="learn_odoo.action_window" model="ir.actions.act_window">
    <field name="name">Learn Odoo</field>
    <field name="type">ir.actions.act_window</field>
    <field name="res_model">learn_odoo.learn_odoo</field>
    <field name="view_mode">tree,form</field>
    <field name="help" type="html">
        <p class="oe_view_nocontent_create">
            创建一条新记录
        </p>
    </field>
</record>

同时修正tag_ids的关联表参数,避免与原模型冲突:

tag_ids = fields.Many2many('mail.channel', 'mail_channel_learn_odoo_rel', 'learn_odoo_id', 'channel_id')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:39