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
相关产品推荐
相关产品推荐

