1.Domain的写法
Domain是一个元组,由3个元素组成 [('字段名', '操作符', 值)]
字段名
如果是Many2one/Many2Many/One2many字段,可以通过’.‘取出对应的属性,如:(‘create_uid.company_id.parent_id’,’=’, user.company_id.id)
操作符
(1)操作符说明
主要说明一下 child_of:比如你要筛选的字段many2one:department_id关联到一个带层级的模型,比如说公司的部门:公司下面有研发部,研发部下面有前端部门,后端部门, 你[('department_id','child_of','研发部id')]就能拿到前端部门和后端部门,parent_of反之。一个找子级,一个找父级
例如:[('department_id', 'child_of', user.department_id.id)],可以找到user.department_id.id下面所有的子部门
['|',('create_uid.company_id','=',[user.company_id.id]),('create_uid.company_id.parent_id','=',[user.company_id.id])]
(2)条件间逻辑运算符说明
Odoo是使用了波兰表示法,操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。如A,B,C,D=[(‘字段名’,‘操作符’,值)],代表一个表达式
<field name="domain">(A,'|',B,C,D)</field>
#运算效果:A and (B or C)and D
#波兰表示法:A and ( or B C)and D
在xml中要进行转义,如下表。
>:>
<:<
":"
':'
&:&
值(value)
包括字符串,True或False,数字等
在xml中,能取出当前登录用户user对象,你可以取出user.company_id.id等
2、domain使用场景
1. 关联字段(Many2one/One2many/Many2many)过滤出不同的选择结果
account_id = fields.Many2one('account.account', string='Default Debit Account', domain=[('active', '=', False)])
2. 过滤出想要显示的字段
在ir.actions.act_windon中添加Domain,当某个地方调用这个动作时,只显示符合domain条件的记录
<record id="relate_partner_opportunities" model="ir.actions.act_window">
<field name="name">Opportunities</field>
<field name="res_model">crm.lead</field>
<field name="view_mode">kanban,tree,form,graph,calendar</field>
<field name="domain">[('type','=','opportunity')]</field>
<field name="context">{
'search_default_partner_id': active_id,
'default_type': 'opportunity'}
</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
</record>
3. 权限过滤
<record id="account_move_comp_rule" model="ir.rule">
<field name="name">Account Entry</field>
<field name="model_id" ref="model_account_move"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>
找父级部门记录
<record id="work_plan.group_parent_department_read_rule" model="ir.rule">
<!--规则的说明-->
<field name="name">父级部门记录读权限</field>
<!--规则适用的模型-->
<field name="model_id" ref="model_work_plan"/>
<!--设置轻松访问记录规则的全局状态-->
<field name="global" eval="False"/>
<!--设置从属关联,授予访问权限的res.groups。为空表示授予每个用户(非员工,例如门户或公共用户)-->
<field name="groups" eval="[(4,ref('work_plan.group_base'))]"/>
<!--条件筛选,如果域与记录匹配,则该规则允许所选操作,否则禁止-->
<field name="domain_force">[('department_id', 'parent_of', user.department_id.id)]</field>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="0"/>
</record>
<!-- 用户可以查看子级部门的工作计划记录-->
<record id="work_plan.group_child_department_read_rule" model="ir.rule">
<field name="name">子级部门记录读权限</field>
<field name="model_id" ref="model_work_plan"/>
<field name="groups" eval="[(4,ref('work_plan.group_base'))]"/>
<field name="domain_force">[('department_id','child_of',user.department_id.id)]</field>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="0"/>
</record>
4. 搜索过滤
<record id="view_crossovered_budget_search" model="ir.ui.view">
<field name="name">crossovered.budget.search</field>
<field name="model">crossovered.budget</field>
<field name="arch" type="xml">
<search string="Budget">
<field name="name" filter_domain="[('name','ilike',self)]" string="Budget"/>
<field name="date_from"/>
<field name="date_to"/>
<filter string="Draft" domain="[('state','=','draft')]" help="Draft Budgets"/>
<filter string="To Approve" domain="[('state','=','confirm')]" help="To Approve Budgets" />
<field name="state"/>
</search>
</field>
</record>
参考文章:https://blog.csdn.net/m0_37826101/article/details/100133882