技术问询:如何在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
相关产品推荐
相关产品推荐

