odoo基础知识常用字段属性及方法使用
1. Related 字段
定义
- 用途:
Related字段用于引用其他模型或同一模型中其他字段的值。 - 特点:
- 不存储在数据库中:每次调用时通过函数计算。
- 存储选项:可以通过设置
store=True将值存储到数据库中,从而支持搜索。
语法
field_name = fields.Related('related_model.field_name', string='Field Label', store=True)
示例
from odoo import models, fields
class MyModel(models.Model):
_name = 'my.model'
_description = 'My Model'
related_field = fields.Related('related_model.field_name', string='Related Field', store=True)
related_model = fields.Many2one('related.model', string='Related Model')
注意事项
- 存储字段:如果需要对
Related字段进行搜索,必须设置store=True。 - 性能:存储字段会增加数据库大小,但可以提高搜索性能。
2. Computed 字段
定义
- 用途:
Computed字段用于根据其他字段动态计算值。 - 特点:
- 不存储在数据库中:每次调用时通过函数计算。
- 存储选项:可以通过设置
store=True将值存储到数据库中,从而支持搜索。 - 只读:默认情况下是只读的,可以通过
inverse方法使其可写。
语法
field_name = fields.Char(compute='_compute_field', inverse='_inverse_field', search='_search_field', store=True)
示例
from odoo import models, fields, api
class MyModel(models.Model):
_name = 'my.model'
_description = 'My Model'
employee_name = fields.Char(string='Employee Name')
upper = fields.Char(compute='_compute_upper', inverse='_inverse_upper', search='_search_upper', store=True)
@api.depends('employee_name')
def _compute_upper(self):
for rec in self:
rec.upper = rec.employee_name.upper() if rec.employee_name else False
def _inverse_upper(self):
for rec in self:
rec.employee_name = rec.upper.lower() if rec.upper else False
def _search_upper(self, operator, value):
if operator == 'like':
return [('employee_name', 'ilike', value.upper())]
return []
注意事项
- 计算依赖:使用
@api.depends装饰器指定依赖字段,确保计算字段在相关字段变化时重新计算。 - 存储字段:如果需要对
Computed字段进行搜索,必须设置store=True。 - Inverse 方法:通过
inverse方法使计算字段可写,反转计算并设置相关字段。
常用装饰器
@api.multi
- 用途:处理记录集。
- 示例:
@api.multi def my_method(self): for record in self: # 处理每条记录
@api.model
- 用途:静态方法,
self参数是一个对象的引用而非记录集。 - 示例:
@api.model def my_method(self): # 静态方法逻辑
@api.depends
- 用途:指定计算字段的依赖字段。
- 示例:
@api.depends('field1', 'field2') def _compute_field(self): for rec in self: rec.computed_field = rec.field1 + rec.field2
@api.constraints
- 用途:用于评估和检查字段值。
- 示例:
@api.constraints('field1', 'field2') def _check_field(self): for rec in self: if rec.field1 < 0 or rec.field2 < 0: raise ValidationError("Fields must be non-negative")
@api.onchange
- 用途:在用户界面交互时自动更新相关字段。
- 示例:
@api.onchange('field1') def _onchange_field1(self): if self.field1: self.field2 = self.field1 * 2
ORM 内置方法
create(values)
- 用途:创建新记录。
- 示例:
new_record = self.create({'field1': 'value1', 'field2': 'value2'})
write(values)
- 用途:更新记录。
- 示例:
self.write({'field1': 'new_value1', 'field2': 'new_value2'})
unlink()
- 用途:删除记录。
- 示例:
self.unlink()
search(domain, offset=0, limit=None, order=None, count=False)
- 用途:根据条件搜索记录。
- 示例:
records = self.search([('field1', '=', 'value1')])
search_read(domain, fields=None, offset=0, limit=None, order=None)
- 用途:搜索并读取记录。
- 示例:
records = self.search_read([('field1', '=', 'value1')], ['field1', 'field2'])
browse(ids)
- 用途:根据 ID 获取记录集。
- 示例:
records = self.browse([1, 2, 3])
read(fields)
- 用途:读取记录的指定字段。
- 示例:
records = self.read(['field1', 'field2'])
copy(default=None)
- 用途:复制记录。
- 示例:
new_record = self.copy({'field1': 'new_value1'})
数据导入导出方法
load(fields, data)
- 用途:从 CSV 文件导入数据。
- 示例:
self.load(['field1', 'field2'], [{'field1': 'value1', 'field2': 'value2'}])
export_data(fields, raw_data=False)
- 用途:导出数据到 CSV 文件。
- 示例:
data = self.export_data(['field1', 'field2'])
UI 相关方法
name_get()
- 用途:返回
(ID, name)元组列表。 - 示例:
def name_get(self): result = [] for record in self: result.append((record.id, record.name)) return result
name_search(name='', args=None, operator='ilike', limit=100)
- 用途:根据输入名称搜索记录。
- 示例:
def name_search(self, name='', args=None, operator='ilike', limit=100): args = args or [] if name: args += [('name', operator, name)] return self.search(args, limit=limit).name_get()
name_create(name)
- 用途:根据名称快速创建记录。
- 示例:
def name_create(self, name): return self.create({'name': name}).name_get()[0]
default_get(fields)
- 用途:返回新记录的默认值。
- 示例:
def default_get(self, fields): defaults = super(MyModel, self).default_get(fields) defaults['field1'] = 'default_value' return defaults
其他方法
search_count(domain)
- 用途:查询记录数量。
- 示例:
count = self.search_count([])
fields_get(allfields=None, attributes=None)
- 用途:获取字段定义。
- 示例:
@api.model def fields_get(self, allfields=None, attributes=None): res = super(MyModel, self).fields_get(allfields, attributes) for key, value in res.items(): if key == 'create_date': res[key]['string'] = '创建时间' elif key == 'write_date': res[key]['string'] = '最后更新时间' return res
invalidate_all()
- 用途:清空缓存。
- 示例:
self.env.invalidate_all()
服务器环境
self.env
- 用途:访问当前用户运行的环境信息。
- 属性:
env.cr:当前的数据库光标。env.user:当前用户的记录。env.uid:会话中用户的 ID。env.context:会话上下文的不可变字典。
- 方法:
env.with_context(dictionary):改变上下文信息。env.sudo(user):以指定用户执行操作,跳过安全规则。
事务和底层 SQL
self.env.cr
- 方法:
commit():提交事务。savepoint():设置保存点。rollback():回滚事务。fetchall():获取所有记录。invalidate_all():清空缓存。
Context
用途
- 传递信息:从一个视图传递到下一个视图。
- 默认值:设置目标视图的默认值或激活默认筛选器。
- 示例:
context = {'default_user_id': self.env.user.id}
Domain 表达式
常见操作符
- 比较符号:
<,>,<=,>=,=,!=。 - 模式匹配:
=like,like,not like,not ilike。 - 子节点:
child of。 - 列表包含:
in,not in。 - 逻辑运算符:
&(AND),|(OR)。
查询模型
search(domain, offset=0, limit=None, order=None, count=False)
- 用途:根据条件搜索记录。
- 示例:
records = self.search([('field1', '=', 'value1')])
browse(ids)
- 用途:根据 ID 获取记录集。
- 示例:
records = self.browse([1, 2, 3])
操作记录集
常用操作
- 包含/排除:
x in the_recordsetx not in the_recordset
- 获取 ID 列表:
recordset.ids
- 过滤:
recordset.filtered(func)
- 映射:
recordset.mapped(func)
- 排序:
recordset.sorted(func)
集合操作
- 并集:
rs1 | rs2
- 交集:
rs1 & rs2
- 差集:
rs1 - rs2
- 切片:
rs[0],rs[-1],rs[1:]
关系字段
多对一 (Many2one)
- 示例:
related_model = fields.Many2one('related.model', string='Related Model')
一对多 (One2many)
- 示例:
related_records = fields.One2many('related.model', 'inverse_field', string='Related Records')
多对多 (Many2many)
- 示例:
related_records = fields.Many2many('related.model', string='Related Records')
总结
- Related 字段:用于引用其他模型或同一模型中的字段,不存储在数据库中,可以通过
store=True存储。 - Computed 字段:用于动态计算字段值,不存储在数据库中,可以通过
store=True存储,并且可以通过inverse方法使其可写。 - 装饰器:
@api.multi,@api.model,@api.depends,@api.constraints,@api.onchange等用于处理不同场景下的逻辑。 - ORM 方法:
create,write,unlink,search,search_read,browse,read,copy等用于操作记录。 - Context:用于传递信息和设置默认值。
- Domain 表达式:用于构建搜索条件。
- 服务器环境:通过
self.env访问当前环境信息。 - 事务和底层 SQL:通过
self.env.cr进行事务操作。
这些方法和字段类型在 Odoo 开发中非常常用,掌握它们可以帮助你更好地设计和实现复杂的业务逻辑。

浙公网安备 33010602011771号