这里将记录我再odoo学习和探索中的收获,可以供大家参考,也方便我后续查阅笔记。
1.ORM
1.self.env 对象
在 Odoo 中,self.env 是一个重要的对象,它是 Odoo ORM 中的核心对象之一。self.env 是一个 Odoo 环境,它提供了访问 Odoo 数据库的 API。在 self.env 中,您可以使用 Odoo ORM 操作数据库中的数据,例如创建、读取、更新和删除记录。
下面是 self.env 中一些常用的方法:
- search(): 使用条件从数据库中检索记录,返回符合条件的记录 ID 列表
- browse(): 根据 ID 列表获取记录,返回一个记录集。
- create(): 创建新记录,并将其写入数据库。
- write(): 更新指定 ID 的记录,并将更改写入数据库。
- unlink(): 根据指定 ID 删除数据库中的记录。
- read(): 从数据库中读取指定 ID 的记录。
- execute(): 执行原始 SQL 查询,并返回查询结果。
用法如下:
# 获取所有状态为'open'的sale.order记录 orders = self.env['sale.order'].search([('state', '=', 'open')]) # 获取id为1的sale.order记录 order = self.env['sale.order'].browse(1) # 获取order对应的partner记录 partner = order.partner_id # 获取id为1的sale.order记录的name和partner_id字段的值 order_data = self.env['sale.order'].browse(1).read(['name', 'partner_id']) # 创建一条新的sale.order记录 new_order = self.env['sale.order'].create({'name': 'New Order', 'partner_id': 1}) # 修改id为1的sale.order记录的name字段的值为'Updated Order' self.env['sale.order'].browse(1).write({'name': 'Updated Order'}) # 删除id为1的sale.order记录 self.env['sale.order'].browse(1).unlink() # 以超级用户的身份获取id为1的sale.order记录 order = self.env['sale.order'].sudo().browse(1) # 定义SQL语句 execute遍底层不建议二开使用 sql = "SELECT * FROM %s WHERE name LIKE '%%s%%'" # 执行SQL语句 self.env.cr.execute(sql % (table_name, 'odoo')) # 获取查询结果 result = self.env.cr.fetchall()
除了上述常用的方法,self.env 还提供了其他一些方法,例如 name_search()、search_count()、exists()、mapped() 等等。其中,name_search() 可以通过名称搜索记录,search_count() 可以获取符合条件的记录数量,exists() 可以检查记录是否存在,mapped() 可以将一个记录集映射到一个字典中。
name_search(name='', args=None, operator='ilike', limit=100)
方法用于在模型的名称字段(默认为name
字段)上进行查询,返回匹配指定名称(name
)的记录 ID 和名称(name
)列表。result = self.env['res.partner'].name_search(name='Acme')
在上面的示例中,
name_search()
方法会在res.partner
模型的名称字段上查找包含 "Acme" 的名称,返回匹配的记录 ID 和名称列表。可以通过传递参数args
来添加其他筛选条件。可以通过传递参数limit
来指定返回结果的最大数量。
search_count(domain=None)
方法用于计算符合给定域(domain
)条件的记录数。count = self.env['res.partner'].search_count([('is_company', '=', True)])
在上面的示例中,
search_count()
方法会计算符合is_company=True
条件的res.partner
模型的记录数。
exists()
方法用于检查是否存在符合给定条件的记录。exists = self.env['res.partner'].exists([('is_company', '=', True)])
在上面的示例中,
exists()
方法会检查是否存在is_company=True
条件的res.partner
模型的记录。如果存在,返回True
,否则返回False
。
mapped(function, *args, **kwargs)
方法将指定函数应用于查询结果的每个记录,并返回一个字典,其中键是记录 ID,值是函数的结果。result = self.env['res.partner'].search([('is_company', '=', True)]).mapped('name')
在上面的示例中,
mapped()
方法会筛选出所有is_company=True
条件的res.partner
模型的记录,并将name
字段的值应用于每个记录,最终返回一个字典,其中键是记录 ID,值是name
字段的值。
在二次开发时,我们经常会用到 self.env 对象,例如创建自定义的业务逻辑、修改数据结构、添加字段等等。另外,在二次开发时,您也可以使用 self.env.context 来访问 Odoo 上下文,它是一个字典,可以在模型中存储上下文信息。
总之,self.env 是 Odoo ORM 的核心对象之一,它提供了一个强大的 API,可以帮助开发人员轻松访问和操作 Odoo 数据库中的数据。在二次开发时,了解 self.env 的方法和属性,能够更加高效地进行开发工作