Odoo技术咨询:如何实现指向同一模型的多个Many2one字段
在Odoo中实现指向同一模型的多个Many2one字段
嘿,我看你在这里有点小误解啦——Odoo里的Many2one字段是用来关联整个模型的,不是单个字段哦!你现在写的fields.Many2one('cod_modA')是错误的,因为cod_modA是模型A里的字段,不是模型本身的技术名称。
先给你理清楚核心逻辑:如果要在模型B里创建两个关联到模型A的Many2one字段,它们的目标都应该是模型A的技术名称(比如假设模型A的_name是model.a),然后通过配置字段的属性来区分它们的用途、显示效果。
正确的代码示例
首先是模型A的定义(确保它的技术名称正确):
from odoo import models, fields class ModelA(models.Model): _name = 'model.a' _description = '模型A' cod_modA = fields.Char(string='代码') descr_modA = fields.Char(string='描述')
然后是模型B的实现,两个Many2one都指向model.a,分别配置不同的显示名称和可选的过滤规则:
from odoo import models, fields, api class ModelB(models.Model): _name = 'model.b' _description = '模型B' # 第一个关联:用于选择模型A中带代码的记录 rel_cod_modB = fields.Many2one( 'model.a', string='代码关联', # 可选:只显示有cod_modA值的记录 domain=[('cod_modA', '!=', False)] ) # 第二个关联:用于选择模型A中带描述的记录 rel_descr_modB = fields.Many2one( 'model.a', string='描述关联', # 可选:只显示有descr_modA值的记录 domain=[('descr_modA', '!=', False)] )
进阶:自定义选择器显示字段
如果希望在选择弹窗里只展示你关心的字段(比如cod_modA或descr_modA),可以给模型A创建专用的视图,然后在Many2one字段里通过context指定使用这个视图:
- 先在模型A的视图文件里定义一个简化的搜索视图:
<record id="model_a_cod_search_view" model="ir.ui.view"> <field name="name">model.a.cod.search</field> <field name="model">model.a</field> <field name="arch" type="xml"> <search> <field name="cod_modA"/> </search> </field> </record>
- 然后在模型B的
rel_cod_modB字段里添加context:
rel_cod_modB = fields.Many2one( 'model.a', string='代码关联', domain=[('cod_modA', '!=', False)], context={'search_view_ref': 'your_module_name.model_a_cod_search_view'} )
额外需求:两个字段联动
如果你的需求是选了rel_cod_modB后,rel_descr_modB自动关联同一个模型A的记录,可以用onchange方法实现:
@api.onchange('rel_cod_modB') def _onchange_cod_to_descr(self): if self.rel_cod_modB: self.rel_descr_modB = self.rel_cod_modB
总结一下核心点:Many2one的第一个参数必须是目标模型的技术名称,不是字段名;通过string区分不同关联的用途;用domain过滤可选记录;用context自定义选择器视图;需要联动就用onchange。
内容的提问来源于stack exchange,提问作者ayar
相关产品推荐
相关产品推荐

