odoo中的约束 constraints

了解 SQL 约束 Python 约束的基本用法

在 Odoo 中,约束(Constraints)用于确保数据的完整性和一致性。Odoo 提供了两种主要的约束类型:SQL 约束和 Python 约束。下面将结合官方文档对这两种约束进行详细介绍。

SQL约束

SQL 约束是通过数据库层面的约束来确保数据的完整性。Odoo 允许开发者在模型定义中使用 _sql_constraints 属性来定义 SQL 约束,如下所示:

from odoo import models, fields

class LibraryBook(models.Model):
    _name = 'library.book'
    _description = 'Library Book'

    name = fields.Char(string='Title', required=True)
    isbn = fields.Char(string='ISBN')

    _sql_constraints = [
        ('unique_isbn', 'UNIQUE(isbn)', 'ISBN must be unique.'),
    ]
  • constraint_name: 约束的名称,必须是唯一的。
  • constraint_type: 约束的类型,通常是 UNIQUE、CHECK等。
  • error_message: 当约束条件不满足时,显示的错误信息。

SQL 约束是在数据库层面执行的,因此它们的执行效率通常比 Python 约束高,但是不能包含复杂的逻辑,只能用于简单的唯一性检查或条件检查。

Python约束

Python 约束是通过 Python 代码来确保数据的完整性。odoo 允许开发者在模型中使用@api.constrains装饰器来定义 Python 约束,如下所示:

from odoo import models, fields, api

class MyModel(models.Model):
    _name = 'my.model'
    _description = 'My Model'

    field1 = fields.Char(string='Field 1')
    field2 = fields.Char(string='Field 2')

    @api.constrains('field1', 'field2')
    def _check_something(self):
        for record in self:
            if record.field1 == record.field2:
                raise models.ValidationError("Field 1 and Field 2 cannot be the same.")
  • @api.constrains('field1', 'field2'): 这个装饰器表示当 field1 或 field2 字段的值发生变化时,_check_something 方法会被调用。
  • _check_something: 这是一个自定义的方法,用于检查字段的值是否符合业务逻辑。如果不符合,可以抛出 models.ValidationError 异常。

Python 约束是在 odoo 的 Python 代码层面执行的,适用于复杂的业务逻辑检查,灵活性高,但执行效率相对较低。

视频讲解

点击下载源码

开发
标签
存档
odoo中的动作按钮(action buttons)
了解"object" 和 "action"两种类型的区别