实体约束
odoo 提供两种实体约束方式:Python constraints
和 SQL constraints
.
Python约束 通过定义一个方法,添加 constrains()
装饰器,在数据记录集合上调用。注解用于确定哪些字段参与约束,所以当其中的字段被修改后,约束条件将自动重新评估。该方法在验证不符合约束条件的情况下需要抛出一个例外错误:
from odoo.exceptions import ValidationError
@api.constrains('age')
def _check_something(self):
for record in self:
if record.age > 20:
raise ValidationError("Your record is too old: %s" % record.age)
# all records passed the test, don't return anything
实体约束练习:7-1
添加 Python 约束: 添加一个约束,检查参加培训的人员不能是其参训课程的讲师。 openacademy/models/models.py
SQL约束 通过定义实体的_sql_constraints
属性来实现,它是一个元组的列表,每个元组是一条数据库约束,包含三个元素(name, sql_definition, message)
, name
是SQL约束的名称,sql_definition
是 table_constraint 表达式,message
是不符合约束条件的错误提示信息。
警告: 注意在使用SQL Constraints,需要确保当前数据库里面没有违反该约束的数据,实际操作中大家注意如果数据库中存在有违反约束的记录,那么在更新模块的时候系统日志里面会有警告信息并且constraints会添加失败。 sql约束要在代码里面删掉貌似不起作用,需要写脚本删除?
实体约束练习:7-2
添加 SQL 约束: 参照 PostgreSQL's documentation 文档,添加下列约束:
- 检查 Course 的描述和标题不相同;
- 确保 Course 的名称唯一; openacademy/models.py
实体约束练习:7-3
添加复制操作 由于我们添加了 Course 名称唯一的约束,所以应该不能使用“Duplicate”功能。 但是可以重载复制功能,将复制后的数据记录名称设置为 “Copy of name”。 openacademy/models.py