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

技术问询:如何在Odoo系统的many2one字段中添加domain?

在Odoo的many2one字段中添加Domain的方法

Domain用于筛选many2one字段可选的关联记录,以下是几种常见实现方式:

1. 模型字段定义时设置静态Domain

在定义many2one字段时,直接通过domain参数指定固定筛选条件,示例如下:

from odoo import models, fields

class YourModel(models.Model):
    _name = 'your.model'
    _description = '自定义模型'

    partner_id = fields.Many2one(
        'res.partner',
        string='客户',
        domain=[('customer_rank', '>', 0)]  # 仅显示客户等级大于0的合作伙伴
    )

2. 在视图中添加/覆盖Domain

如果需要在特定视图中调整筛选规则,可在视图的<field>标签中添加domain属性,优先级高于模型中定义的domain:

<record id="your_model_form_view" model="ir.ui.view">
    <field name="name">your.model.form.view</field>
    <field name="model">your.model</field>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <field name="partner_id" domain="[('supplier_rank', '>', 0)]"/>
                <!-- 其他字段 -->
            </sheet>
        </form>
    </field>
</record>

上述示例中,该视图里的partner_id仅会显示供应商。

3. 动态Domain(基于上下文或其他字段)

若需要根据当前记录的字段值或上下文动态调整筛选条件,有两种实现方式:

方式一:模型中用函数返回动态Domain

class YourModel(models.Model):
    _name = 'your.model'
    _description = '自定义模型'

    type = fields.Selection([('customer', '客户'), ('supplier', '供应商')], string='类型')
    partner_id = fields.Many2one(
        'res.partner',
        string='合作伙伴',
        domain='_get_partner_domain'
    )

    def _get_partner_domain(self):
        domain = []
        if self.type == 'customer':
            domain.append(('customer_rank', '>', 0))
        elif self.type == 'supplier':
            domain.append(('supplier_rank', '>', 0))
        return domain

方式二:视图中使用动态表达式

直接基于当前记录的其他字段构建domain:

<field name="partner_id" domain="[('company_id', '=', company_id)]"/>

此示例会筛选出与当前记录company_id一致的合作伙伴。

内容的提问来源于stack exchange,提问作者Ahmad Daud Juned

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:16:11