Skip to Content

Odoo 19 方法装饰器概述及用法

Odoo 19 中的方法装饰器概述

Odoo 19 中的方法装饰器在无需修改现有方法实际实现的情况下,对其行为进行改变或扩展方面发挥着关键作用。这些装饰器对方法进行包装并提供额外功能,从而简化操作并增强 Odoo 框架的灵活性。理解如何以及何时使用这些装饰器,能显著改善开发工作流,尤其是在构建复杂企业应用时。

下面详细介绍 Odoo 19 中的一些关键方法装饰器及其典型用法。

1、@api.model:此装饰器用于不依赖任何特定记录的方法。这意味着该方法可以在不需要特定记录集的情况下被调用,并且在模型的上下文中运行,而非针对单个记录。

示例:

class StudentInfo(models.Model):
    _name = "student.info"

    @api.model
    def student_info_model_method(self):
        # 不依赖特定记录的代码
        # 使用 self.env 创建新记录
        return self.create({'name': '陈一'})

在这个例子中,student_info_model_method可从模型级别访问,并且能够在没有特定记录上下文的情况下处理逻辑,此处是新建一名名字为“陈一”的学生。

2、@api.depends:@api.depends装饰器对计算字段至关重要。它指定计算方法所依赖的字段,确保当这些依赖字段中的任何一个发生变化时,该方法会被触发重新计算。

示例:

class StudentInfo(models.Model):
    _name = "student.info"

    credit = fields.Float(string='学分', compute='compute_student_credit', store=True, default=0)
    state = fields.Selection([('draft', '草稿'), ('in_progress', '进行中'), ('completed', '已结束')],string='状态', default='draft', clickable=True) 
                             
    @api.depends('state')
    def compute_student_credit(self):
        for record in self:
            if record.state == 'completed':
                record.credit += 1

在这个示例中,每当state的值发生变化时,compute_student_credit都会重新计算credit。

3、@api.constrains:此装饰器用于对字段值强制执行约束。当指定的字段发生变化时,被装饰的方法会被触发,检查值是否符合定义的规则。

示例:

class StudentInfo(models.Model):
    _name = "student.info"
  
    parent_id = fields.Many2one('student.info', string='上级学生', ondelete='set null')
    state = fields.Selection([('draft', '草稿'), ('in_progress', '进行中'), ('completed', '已结束')],string='状态', default='draft', clickable=True) 

    @api.constrains('parent_id', 'state')
    def check_parent_id_state(self):
        for record in self:
            if record.state in ['in_progress', 'completed']:
                if not record.parent_id:
                    raise ValidationError("在课程状态为已开始和已结束时,上级学生必须有值")

这里,_check_parent_id_state确保在非草稿状态下,上级菜单必须有值,若没有值,则会抛出异常。

4、@api.onchange:此装饰器用于在 UI 中指定字段发生变化时应触发的方法。它通常在表单视图中用于在保存记录前,根据用户输入动态更新字段。

示例:

class StudentInfo(models.Model):
    _name = "student.info"

    age = fields.Float(string="年龄")

    @api.onchange('age')
    def _onchange_age(self):
        if self.age < 18:
            raise ValidationError("学生年龄必须大于18")

在这种情况下,每当年龄字段发生变化时,_onchange_age都会被调用,如果年龄小于18时,抛出异常。

5、@api.returns(odoo19已经弃用):@api.returns装饰器用于返回指定模型实例的方法。它接受三个参数:model(模型名称,或用self表示当前模型);downgrade(将记录式输出转换为传统输出的函数);upgrade(将传统输出转换为记录式输出的函数)。该装饰器根据调用方式调整方法输出,使其能够返回 ID、ID 列表或记录集。

示例:

class StudentInfo(models.Model):
    _name = "student.info"
    
    @api.returns('self')
    def copy(self, default=None):
        # 复制记录的自定义逻辑
        return super(StudentInfo, self).copy(default)

在这个示例中,copy方法确保在执行操作后返回当前模型记录集的新实例。

6、@api.model_create_multi:此装饰器用于同时创建多个记录的场景。它通过减少所需的数据库事务数量来优化性能。

示例:

class StudentInfo(models.Model):
    _name = "student.info"
    
    @api.model_create_multi
    def create(self, vals_list):
        # 多个记录的优化创建
        return super(StudentInfo, self).create(vals_list)

通过使用@api.model_create_multi,该方法能够通过批量处理高效创建多个记录。

7、@api.autovacuum:autovacuum方法装饰器允许你标记一个方法,使其作为每日自动清理 cron 任务(模型ir.autovacuum)的一部分运行。这对于类似垃圾回收的任务非常有用,有助于管理资源,且无需单独的 cron 任务。通过使用此装饰器,你可以确保必要的维护任务定期自动执行,而无需为每个任务单独设置 cron 作业。

8、@api.depends_context:depends_context装饰器指定非存储的 “compute” 方法所依赖的上下文键。每个参数代表上下文字典中的一个键。例如:

from odoo import models, fields, api
class ProductTemplate(models.Model):
    _inherit = 'product.template'

    discount_price = fields.Float(compute='_compute_discount_price')
    @api.depends_context('discount_rate')
    def _compute_discount_price(self):
        for product in self:
            discount_rate = self.env.context.get('discount_rate', 0.0)
            product.discount_price = product.list_price * (1 - discount_rate / 100)

在这个示例中,discount_price字段根据上下文中的discount_rate键计算产品的折扣价格。如果上下文中提供了discount_rate,该方法会通过将该比率应用于产品的标价来计算折扣价格。如果没有折扣率,则默认为 0,结果为全额标价。

总结

Odoo 19 中的方法装饰器是增强框架功能的强大工具。它们允许开发人员编写简洁、高效且可重用的代码,简化开发过程。理解如何有效使用这些装饰器,能显著改进 Odoo 应用,使其更健壮、更易用。

无论你是创建新模型还是增强现有模型,充分利用方法装饰器都能帮助你充分发挥 Odoo 的强大功能,从而为业务需求构建更好的解决方案。

Odoo 19 方法装饰器概述及用法
中国 Odoo, 苏州远鼎 January 19, 2026
Tags
Archive