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

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指定使用这个视图:

  1. 先在模型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>
  1. 然后在模型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:07:50