Odoo 的 ORM(对象关系映射)框架提供了一种高效、简洁的方法来与数据库进行交互,无需编写原生 SQL 语句。通过 ORM,开发者可以使用 Python 对象和方法操作数据库记录。以下是 Odoo ORM 查询的一些关键点和常用操作:
1. 搜索记录 (search)
search
方法用于查询符合条件的记录,返回一个记录集。常用的用法是通过条件列表进行查询:
records = self.env['模型名称'].search([('字段名', '操作符', '值')])
'模型名称'
是要查询的模型,比如res.partner
。- 条件列表是由元组组成的列表,元组中包含字段名、操作符和条件值。
- 常用操作符:
'='
: 等于'!='
: 不等于'>'
: 大于'<='
: 小于等于'in'
: 在某个列表中'like'
: 模糊匹配'ilike'
: 不区分大小写的模糊匹配
示例:
partners = self.env['res.partner'].search([('name', 'ilike', 'John')])
2. 获取单个记录 (search)
使用 search
返回单个记录时,可以限制返回结果数量:
record = self.env['模型名称'].search([('字段名', '操作符', '值')], limit=1)
3. 读取字段值 (read / browse)
read
方法用于批量读取记录的指定字段,返回字典形式的字段数据。browse
方法返回模型的记录集,但不直接从数据库中读取数据,数据在访问时才加载。
# 读取字段
record_data = self.env['模型名称'].search([('字段名', '操作符', '值')]).read(['字段1', '字段2'])
# 或使用 browse 获取记录集
record = self.env['模型名称'].browse(记录ID)
4. 创建记录 (create)
create
方法用于创建一条新记录。需要提供一个字典,字典的键为字段名,值为字段值。
new_record = self.env['模型名称'].create({
'字段1': '值1',
'字段2': '值2',
})
5. 更新记录 (write)
write
方法用于更新现有记录的字段值。它通常与 search
或 browse
配合使用。
record = self.env['模型名称'].search([('字段名', '操作符', '值')])
record.write({
'字段1': '新值1',
'字段2': '新值2',
})
6. 删除记录 (unlink)
unlink
方法用于删除符合条件的记录:
records = self.env['模型名称'].search([('字段名', '操作符', '值')])
records.unlink()
7. 计算统计信息 (search_count)
search_count
用于获取符合条件的记录数量,而不是返回记录集。
count = self.env['模型名称'].search_count([('字段名', '操作符', '值')])
8. 聚合和分组 (read_group)
read_group
方法用于进行类似 SQL 的分组查询,通常用于报表和统计。
grouped_data = self.env['模型名称'].read_group(
[('字段名', '操作符', '值')],
['字段1', '字段2:sum'], # 字段及聚合函数
['字段1'] # 分组依据
)
示例:查询客户记录
# 查询名字包含 'John' 的客户
partners = self.env['res.partner'].search([('name', 'ilike', 'John')])
# 获取第一条记录
partner = self.env['res.partner'].search([('name', 'ilike', 'John')], limit=1)
# 更新记录
partner.write({'phone': '1234567890'})
# 删除记录
partner.unlink()
# 统计符合条件的记录数量
count = self.env['res.partner'].search_count([('country_id', '=', 1)])
Odoo ORM 提供了强大的数据库操作功能,简化了开发者与数据库的交互,使用时无需关心底层 SQL 实现。