- 上传者: Administrator
- 上传时间:2023年12月04日 23时42分10秒
在 上一章 [1] 中,我们介绍了向模型中添加一些业务逻辑的能力。现在我们可以将按钮链接到业务代码,但是如何防止用户输入不正确的数据呢?例如,在我们的房地产模块中,没有任何东西可以阻止用户设置负的预期价格。 Odoo 提供了两种设置自动验证不变量的方法: None [2] Python 约 ......
金额应该是(严格)正数
属性类型和标签应该有唯一的名称
物业预期价格必须严格为正数
房产销售价格必须为正数
报价必须严格为正数
属性标签名称和属性类型名称必须唯一
在 上一章 中,我们介绍了向模型中添加一些业务逻辑的能力。现在我们可以将按钮链接到业务代码,但是如何防止用户输入不正确的数据呢?例如,在我们的房地产模块中,没有任何东西可以阻止用户设置负的预期价格。
Odoo 提供了两种设置自动验证不变量的方法: Python 约束
和 SQL 约束
。
SQL
参考: 有关此主题的文档可以在 模型 和 PostgreSQL 的文档 中找到。
注解
目标:在本节结束时:


SQL 约束是通过模型属性 _sql_constraints
定义的。此属性被赋予一个包含字符串 (name, sql_definition, message)
的三元组列表,其中 name
是一个有效的 SQL 约束名, sql_definition
是一个 table_constraint 表达式, message
是错误消息。
您可以在这里找到一个简单的例子 here.
Exercise
添加 SQL 约束。
将以下约束条件添加到相应的模型中:
提示:在Odoo代码库中搜索 unique
关键字以获取唯一名称的示例。
使用 -u estate
选项重新启动服务器以查看结果。请注意,您可能有数据阻止 SQL 约束的设置。可能会弹出类似以下错误消息的消息框:
ERROR rd-demo odoo.schema: Table 'estate_property_offer': unable to add constraint 'estate_property_offer_check_price' as CHECK(price > 0)
例如,如果某些报价的价格为零,则无法应用约束条件。您可以删除有问题的数据以应用新的约束条件。
Python
参考: 有关此主题的文档可以在 constrains()
中找到。
注解
目标:在本节结束时,将不可能接受低于预期价格的90%的报价。

SQL约束是确保数据一致性的有效方法。但是,可能需要进行更复杂的检查,需要使用Python代码。在这种情况下,我们需要一个Python约束。
Python 约束是一个使用 constrains()
装饰的方法,它在记录集上被调用。装饰器指定了哪些字段参与约束。当这些字段中的任何一个被修改时,约束会自动进行评估。如果不满足其不变量,该方法应该引发异常:
from odoo.exceptions import ValidationError
...
@api.constrains('date_end')
def _check_date_end(self):
for record in self:
if record.date_end < fields.Date.today():
raise ValidationError("The end date cannot be set in the past")
# all records passed the test, don't return anything
一个简单的例子可以在 这里 找到。
Exercise
添加 Python 约束。
添加一个约束条件,使得销售价格不能低于预期价格的90%。
提示:在报价被验证之前,销售价格为零。您需要微调您的检查以考虑这一点。
警告
始终在处理浮点数时使用 odoo.tools.float_utils
中的 float_compare()
和 float_is_zero()
方法!
确保每次销售价格或预期价格发生变化时都会触发约束条件!
SQL约束通常比Python约束更有效。当性能很重要时,始终优先选择SQL而不是Python约束。
我们的房地产模块看起来不错。我们添加了一些业务逻辑,现在我们确保数据的一致性。然而,用户界面还有点粗糙。让我们看看在 下一章节 中我们如何改进它。
- 微信扫一扫,一分也是爱:
-
服务原则及地区范围
宜兴通达网络科技有限公司,地处中国宜兴环科园内,是一家高新技术企业。公司在企业网络维护和企业信息化建设与咨询方面,有10多年经验。
我公司愿与客户一道,力求彻底解决客户问题!
我们不是在给企业提供“头痛医头、脚痛医脚”的暂时解决方案,而是在部署根本性安全与稳定服务!!
我们愿携手客户,建立企业IT规划;杜绝随意安装系统、软件等操作;力求共同维护有序、安全、稳定的网络办公环境!!!
IT服务,服务是根本,客户是上帝;我们提供快速响应、快速上门、快速排查,提供优质高效的服务!!!!
通达科技提供全国范围内的服务,服务形式包括远程协助、电话咨询、电子邮件咨询、传真咨询、问答平台的问题解决等。
宜兴地区提供上门服务:
- 市区服务:宜城街道、城北街道(屺亭街道)、新街街道、新庄街道、环科园、渚桥开发区
- 市郊服务:张渚镇、西渚镇、太华镇、徐舍镇、官林镇、杨巷镇、新建镇、和桥镇、高塍镇、万石镇、周铁镇、芳桥镇、丁蜀镇、湖父镇。