文章目录
- 1. `@api.model`
- 用途
- 特点
- 示例
- 2. `@api.depends`
- 用途
- 特点
- 示例
- 3. `@api.onchange`
- 用途
- 特点
- 示例
- 总结
在 Odoo 中,装饰器(decorators)用于修饰方法,以指定它们的行为和触发条件。@api.model
、@api.depends
和 @api.onchange
是三个常用的装饰器,分别用于不同的场景。以下是它们的区别和使用方式:
1. @api.model
用途
@api.model
装饰器用于定义类级别的方法(也称为静态方法),这些方法不依赖于具体的记录实例。它们通常用于执行与模型相关的操作,但不需要访问特定的记录数据。
特点
- 上下文:方法不会接收记录集作为参数,而是通过
self.env
访问环境。 - 应用场景:创建新记录、批量处理、初始化等。
示例
from odoo import models, api
class MyModel(models.Model):
_name = 'my.model'
@api.model
def create_default_record(self):
# 使用 self.env 创建新记录
return self.create({'field_name': 'value'})
2. @api.depends
用途
@api.depends
装饰器用于定义计算字段的方法,并指定哪些字段的变化会触发该方法重新计算。它确保每当指定的依赖字段发生变化时,计算字段会自动更新。
特点
- 依赖字段:方法需要明确列出依赖的字段,当这些字段变化时,计算字段会重新计算。
- 应用场景:定义计算字段、动态计算值。
示例
from odoo import models, fields, api
class MyModel(models.Model):
_name = 'my.model'
field_a = fields.Float('Field A')
field_b = fields.Float('Field B')
total = fields.Float('Total', compute='_compute_total')
@api.depends('field_a', 'field_b')
def _compute_total(self):
for record in self:
record.total = record.field_a + record.field_b
在这个例子中,每当 field_a
或 field_b
发生变化时,_compute_total
方法会被调用,重新计算 total
字段。
3. @api.onchange
用途
@api.onchange
装饰器用于定义当表单视图中的某些字段值发生变化时,自动触发的方法。它允许你在用户输入时实时响应并更新其他字段或显示警告信息。
特点
- 即时响应:方法会在用户修改字段时立即执行,提供即时反馈。
- 应用场景:验证输入、动态更新字段、显示提示信息。
示例
from odoo import models, fields, api
class MyModel(models.Model):
_name = 'my.model'
field_a = fields.Float('Field A')
field_b = fields.Float('Field B')
warning_message = fields.Char('Warning Message')
@api.onchange('field_a', 'field_b')
def _onchange_fields(self):
if self.field_a and self.field_b and self.field_a > self.field_b:
self.warning_message = "Field A should not be greater than Field B."
else:
self.warning_message = ""
在这个例子中,当用户修改 field_a
或 field_b
时,_onchange_fields
方法会被调用,根据条件设置 warning_message
字段。
总结
装饰器 | 用途 | 参数传递 | 应用场景 |
---|---|---|---|
@api.model | 定义类级别方法,不依赖具体记录实例 | 不接收记录集,通过 self.env 访问环境 | 创建新记录、批量处理、初始化等 |
@api.depends | 定义计算字段的方法,指定依赖字段 | 接收记录集 | 计算字段、动态计算值 |
@api.onchange | 定义表单视图中字段变化时触发的方法 | 接收记录集 | 验证输入、动态更新字段、提示信息 |
选择合适的装饰器可以确保代码的清晰性和功能性。