odoo-041 domain特殊操作符,parent_of、child_of 用于层级关系字段 many2one、many2many 的筛选

一、疑问困惑

最近要对记录做各种筛选,尝试了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_ofparent_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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sapphire~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值