使用记录集和作用域(domain)查询数据
- 在方法中,
self
表示当前模型,并且我们仅能访问该模型的记录。要访问其它模型就需要使用self.env
。 - 例如
self.env['res.partner']
返回一条对Partner
模型的引用(也是一个空记录集)。 - 我们可以使用
search()
或browse()
来获取记录集,其中search()
方法使用域表达式来定义记录选择范围。
创建记录集
search()
方法接收一个域表达式并返回符合条件记录的记录集。空域[]将返回所有记录。- 如果模型有特殊字段
active
,默认只有active=True
的记录才在选择范围内。 - 还可以使用以下关键字参数:
order
是一个数据库查询语句中ORDER BY
使用的字符串,通常是一个逗号分隔的字段名列表。每个字段都可接DESC
关键字,用于表示倒序排列。limit
设置获取记录的最大条数offset
忽略前n前记录,可配合limit
使用来一次查询指定范围记录
- 有时我们只要知道满足某一条件的记录条数,这时可使用
search_count()
来返回记录条数而非记录集。这节约了先获取记录列表再记数的开销,在还没有获取记录集且仅想知道记录条数时这样会更高效。 browse()
方法接收一个ID列表或单个ID并返回这些记录的记录集。在我们知道ID并想要获取记录时这就非常方便了。- 一些使用示例如下:
1 | 'res.partner'].search([('name', 'like', 'Pac')]) self.env[ |
域表达式(domain)
- 域(domain)用于过滤数据记录。它使用一个特殊语法来供
Odoo ORM
解析,生成数据库查询中的WHERE
表达式。域表达式是一组条件组成的列表,每个条件都是一个(‘字段名’, ‘运算符’, ‘值’’)组成的元组,
例如,[('is_done', '=', False)]
是仅带有一个条件的有效域表达式。 - 以下是对各个元素的说明:
- 字段名:是一个待过滤字段,可使用点号标记来表示关联模型中的字段
- 值:在 Python 表达式中运行。可使用字面值,如数字、布尔值、字符串和列表,也可使用运行上下文中的字段和标识符。针对域其实有两种运行上下文:
- 在窗口操作或字段属性等客户端中使用时,可使用原生字段值来渲染当前可用视图,但不能对其使用点标记符
- 在服务端使用时,如安全记录规则或服务端 Python代码中,可以对字段使用点标记符,因为当前记录是一个对象
- 运算符:可以是以下中的一个
- 常用比较运算符有<, >, <= , >=, =和!=。
- ‘=like’和’=ilike’匹配某一模式,这里下划线_匹配单个字符,百分号%匹配任意一组字符。
- ‘like’匹配’%value%'模式,'ilike’与其相似但忽略大小写。还可以使用’not like’和’not ilike’运算符。
- 'child of’在配置支持层级关联的模型中查找层级关系中的子级值。
- 'in’和’not in’用于查看给定列表的包含,所以其值为一个列表。用于to-many关联字段时,in运算符和contains运算符一样。
- 'not in’是in的反向运算,用于查看不在列表中的值。
- 域表达式是一个列表并且包含多个条件元组。默认这些条件使用AND逻辑运算符连接,也就是说它仅返回满足所有条件的记录。也可以使用显式逻辑运算符 —— '&‘符号表示 AND运算符(默认值),管道运算符’|'表示OR运算符。这两个运算符会作用于接下来的两项,递归执行。
- 域表达式使用了更为正式的定义方式:前缀标记法,也称波兰表达式(Polish notation):运算符放在运算项之前。AND和OR是二元运算符,而NOT是一元运算符。
- 感叹号’!'表示NOT运算符,可用于下一项的运算,因此要放执行的否定项之前。例如
['!', ('is_done','=',True)]
将过滤出所有未完成(not-done)的记录。 - 下一项本身也可以是一个作用其后续项的运算符,形成一个嵌套条件。
- 下例可以有助于我们进行理解。在服务端记录规则中,可以找到类似下面这样的域表达式:
1 | ['|', |