Loading

odoo domain 的三种方法

简介

在 odoo 中 domain 无处不在,就是过滤数据用的,备选项,可选项,都是用domain过滤的。

也就是sqlalchemy的filter

 

一:定义在model

class DemoExpenseTutorial(models.Model):
    _name = 'demo.expense.tutorial'
    ......
    employee_id = fields.Many2one('hr.employee', string="Employee", required=True,
                domain=[('active', '=', True)] )

 

二:定义在view

  <record id="view_form_demo_expense_tutorial" model="ir.ui.view">
    <field name="name">Demo Expense Tutorial Form</field>
    <field name="model">demo.expense.tutorial</field>
    <field name="arch" type="xml">
      <form string="Demo Expense Tutorial">
        ......
            <field name="employee_id" domain="[('user_id', '=', user_id)]"/>
        ......
          </group>
        </sheet>
      </form>
    </field>
  </record>

 

 

三:定义在onchang

@api.onchange('user_id')
def onchange_user_id(self):
    # domain
    result = dict()
    result['domain'] = {
        'employee_id': [('user_id', '=', self.user_id.id)]
    }
    # equal
    # self.env['hr.employee'].search([('user_id', '=', self.user_id.id)])
    return result

 

四:domain的波兰表示法

domain的集合是用波兰表示法做的

 

五:特殊运算符 child_of、parent_of

有时候遇到需要搜索或者筛选出层级关系中,某个节点以后该节点的所有子节点,或者某节点以及该节点的所有父节点的记录时,需要使用odoo的child_of,和parent_of两个筛选条件

使用示例:

self.search([('id', 'child_of', menu_roots.ids)])
domain="[('hr_department_id', 'child_of', parent.department_id)]"
('id', 'parent_of', self.subsystem_id.id)
domain = [('view_location_id', 'parent_of', self.ids)]

对python代码和xml中皆可使用

 

posted @ 2022-07-23 20:06  上官飞鸿  阅读(1120)  评论(0)    收藏  举报