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

Odoo 12模型如何仅继承指定部分字段?

Odoo 12 实现仅继承父模型指定字段的方案

在Odoo中,常规的模型继承(_inherit)会自动继承父模型的所有字段,无法直接指定仅继承部分字段。要实现你的需求,有两种可行方案:

方案1:关联+关联字段(模型层面仅保留指定字段)

创建新模型,通过One2one关联父模型,再用related字段映射需要的父模型字段。这种方式下,新模型的数据库表中仅包含你指定的字段,完全隔离不需要的字段。

父模型示例(my.model.main)

from odoo import models, fields

class MyModelMain(models.Model):
    _name = 'my.model.main'
    
    a = fields.Char(string='字段A')
    b = fields.Char(string='字段B')
    c = fields.Char(string='字段C')
    d = fields.Integer(string='字段D')
    e = fields.Float(string='字段E')
    f = fields.Date(string='字段F')
    g = fields.Boolean(string='字段G')

新模型示例(my.model.test)

from odoo import models, fields

class MyModelTest(models.Model):
    _name = 'my.model.test'
    
    # 与父模型建立一对一关联
    main_id = fields.One2one('my.model.main', string='主记录', required=True, ondelete='cascade')
    # 映射需要的父模型字段,store=True表示将值存储在当前模型的数据库表中(可选)
    a = fields.Char(related='main_id.a', string='字段A', store=True)
    d = fields.Integer(related='main_id.d', string='字段D', store=True)
    g = fields.Boolean(related='main_id.g', string='字段G', store=True)

方案2:继承后隐藏不需要的字段(模型层面仍存在字段,视图中隐藏)

如果必须使用模型继承(_inherit),可以继承父模型后,在视图中隐藏不需要的字段,或者在模型层将不需要的字段设置为不可见/非必填。这种方式下,模型层面仍会继承所有字段,但用户在界面上看不到不需要的字段。

模型继承示例

from odoo import models, fields

class MyModelTest(models.Model):
    _name = 'my.model.test'
    _inherit = 'my.model.main'
    
    # 可在此重定义不需要的字段,设置为不可见或禁用
    b = fields.Char(string='字段B', invisible=True)
    c = fields.Char(string='字段C', invisible=True)
    e = fields.Float(string='字段E', invisible=True)
    f = fields.Date(string='字段F', invisible=True)

对应视图示例(XML)

<odoo>
    <record id="view_my_model_test_form" model="ir.ui.view">
        <field name="name">my.model.test.form</field>
        <field name="model">my.model.test</field>
        <field name="inherit_id" ref="模块名.view_my_model_main_form"/>
        <field name="arch" type="xml">
            <!-- 隐藏不需要的字段 -->
            <field name="b" position="attributes">
                <attribute name="invisible">1</attribute>
            </field>
            <field name="c" position="attributes">
                <attribute name="invisible">1</attribute>
            </field>
            <field name="e" position="attributes">
                <attribute name="invisible">1</attribute>
            </field>
            <field name="f" position="attributes">
                <attribute name="invisible">1</attribute>
            </field>
        </field>
    </record>
</odoo>

注意:方案2只是在界面隐藏字段,数据库表中仍会存在这些字段,若需要完全隔离不需要的字段,优先选择方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:10:37