在 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 代码层面执行的,适用于复杂的业务逻辑检查,灵活性高,但执行效率相对较低。