一、疑问困惑
最近要对记录做各种筛选,尝试了domain, name_search, ir.rule, onchange, compute, search, default, set, context 等等方法,发现对odoo有些还是不理解。
今天记录一个刚解决问题的方法,使用domain的特殊操作符 child_of, parent_of。
二、场景再现
1、场景再现1
前提: 在 product.prodcut 中定义了一个many2many字段 company_ids;
需求:在创建PO时,不能选择用户所在公司不在产品的company_ids中的数据。
解决方法:在视图的product_id上添加domain,
关键点是这个domain:[('company_ids', 'parent_of', company_id)]
<record id="view_purchase_order_form_inherit" model="ir.ui.view">
<field name="name">purchase.order.form.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="before">
<field name="company_id"/>
</xpath>
<xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="attributes">
<attribute name="domain">[('company_ids', 'parent_of', company_id)]</attribute>
</xpath>
</field>
</record>
三、知识温故
知识点1:记录规则中的公共变量
在Odoo中编写记录规则时,可以使用以下公共变量:
time:Python的time模块,可以用于获取当前时间或日期。
user:当前用户,作为一个单例记录集。
company_id:当前用户当前选择的公司ID(不是记录集)。
company_ids:当前用户可以访问的所有公司ID列表(不是记录集)。
这些变量可以在domain_force字段中使用,用于定义记录规则的条件。
知识点2: domain 的特殊操作符 child_of, parent_of
在Odoo中,domain 用于定义记录的过滤条件。domain 是一个由三元组组成的列表,每个三元组包含一个字段名、一个操作符和一个值。以下是一些常见的操作符及其含义:
比较操作符: (=, !=, >, >=, <, <=)
字符串操作符: (=like/like, =ilike/ilike)(不区分大小写)
特殊操作符: (in, not in, child_of, parent_of)
举例:主要说
child_of和parent_of
child_of:值是某个记录的子记录
parent_of:值是某个记录的父记录
child_of:用于筛选某个记录的所有子记录。
# 这个表达式会筛选出当前用户所在部门及其所有子部门的记录。
[('department_id', 'child_of', user.department_id.id)]
parent_of:用于筛选某个记录的所有父记录。
# 这个表达式会筛选出当前用户所在部门及其所有父部门的记录
[('department_id', 'parent_of', user.department_id.id)]

1851

被折叠的 条评论
为什么被折叠?



