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中皆可使用

浙公网安备 33010602011771号