odoo中@api.model, @api.depends和@api.onchange 装饰器的区别

文章目录

在 Odoo 中,装饰器(decorators)用于修饰方法,以指定它们的行为和触发条件。@api.model@api.depends@api.onchange 是三个常用的装饰器,分别用于不同的场景。以下是它们的区别和使用方式:

1. @api.model

用途

@api.model 装饰器用于定义类级别的方法(也称为静态方法),这些方法不依赖于具体的记录实例。它们通常用于执行与模型相关的操作,但不需要访问特定的记录数据。

特点
  • 上下文 :方法不会接收记录集作为参数,而是通过 self.env 访问环境。
  • 应用场景:创建新记录、批量处理、初始化等。
示例
python 复制代码
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 装饰器用于定义计算字段的方法,并指定哪些字段的变化会触发该方法重新计算。它确保每当指定的依赖字段发生变化时,计算字段会自动更新。

特点
  • 依赖字段:方法需要明确列出依赖的字段,当这些字段变化时,计算字段会重新计算。
  • 应用场景:定义计算字段、动态计算值。
示例
python 复制代码
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_afield_b 发生变化时,_compute_total 方法会被调用,重新计算 total 字段。

3. @api.onchange

用途

@api.onchange 装饰器用于定义当表单视图中的某些字段值发生变化时,自动触发的方法。它允许你在用户输入时实时响应并更新其他字段或显示警告信息。

特点
  • 即时响应:方法会在用户修改字段时立即执行,提供即时反馈。
  • 应用场景:验证输入、动态更新字段、显示提示信息。
示例
python 复制代码
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_afield_b 时,_onchange_fields 方法会被调用,根据条件设置 warning_message 字段。

总结

装饰器 用途 参数传递 应用场景
@api.model 定义类级别方法,不依赖具体记录实例 不接收记录集,通过 self.env 访问环境 创建新记录、批量处理、初始化等
@api.depends 定义计算字段的方法,指定依赖字段 接收记录集 计算字段、动态计算值
@api.onchange 定义表单视图中字段变化时触发的方法 接收记录集 验证输入、动态更新字段、提示信息

选择合适的装饰器可以确保代码的清晰性和功能性。

相关推荐
山上春1 个月前
Odoo17 4模型安全访问控制:深入理解 model_id:id 和 group_id:id
数据库·安全·odoo
Odoo老杨1 个月前
No.1免费开源ERP:Odoo自定义字段添加到配置页中的技术分享
python·odoo·数字化转型·erp·企业信息化
Odoo老杨1 个月前
Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享
javascript·odoo·数字化转型·erp·企业信息化
Odoo老杨1 个月前
Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍
人工智能·odoo·数字化转型·erp·企业信息化·出海企业
Odoo老杨2 个月前
如何在 Odoo18 视图中添加关联数据看板按钮 | 免费开源ERP实施诀窍
odoo·数字化转型·erp·企业信息化管理
Odoo老杨2 个月前
Odoo :一款免费且开源的食品生鲜领域ERP管理系统
odoo·数字化转型·erp·企业信息化·生鲜食品行业
Odoo老杨2 个月前
Odoo :免费且开源的农牧行业ERP管理系统
odoo·数字化转型·erp·企业信息化·农牧行业
Dear.爬虫2 个月前
Odoo中,要实现实时数据推送,SSE 与 WebSocket 该如何选择
websocket·网络协议·sse·odoo·实时数据推送
Mr.E52 个月前
odoo 17 后端路由接口认证自定义
odoo·odoo17·odoo后端