odoo17 | 视图字段验证约束

前言

前一章介绍了向模型添加一些业务逻辑的能力。现在我们可以将按钮链接到业务代码,但是我们如何防止用户输入错误的数据呢?例如,在我们的房地产模块中,没有什么可以阻止用户设置负预期价格。

Odoo提供了两种方法来设置自动验证的不变量:Python约束和SQL约束。

SQL约束

目标

  • 金额应严格限制为正数
    在这里插入图片描述
  • 属性类型和标记应具有唯一的名称
    在这里插入图片描述
    SQL约束是通过模型属性**_sql_constraints定义的。这个属性被分配一个包含字符串(name、sql_definition、message)的三元组列表,其中name是一个有效的SQL约束名称,sql_definition是一个table_constraint**表达式,message是错误消息。
    您可以在这里找到一个简单的示例:
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.from collections import defaultdict
from odoo import api, fields, models, _
from odoo.osv import expression
from odoo.exceptions import ValidationErrorclass AccountAnalyticDistribution(models.Model):_name = 'account.analytic.distribution'_description = 'Analytic Account Distribution'_rec_name = 'account_id'account_id = fields.Many2one('account.analytic.account', string='Analytic Account', required=True)percentage = fields.Float(string='Percentage', required=True, default=100.0)name = fields.Char(string='Name', related='account_id.name', readonly=False)tag_id = fields.Many2one('account.analytic.tag', string="Parent tag", required=True)_sql_constraints = [('check_percentage', 'CHECK(percentage >= 0 AND percentage <= 100)','The percentage of an analytic distribution should be between 0 and 100.')]
  • name 为 check_percentage
  • sql_definition 为 CHECK(percentage >= 0 AND percentage <= 100)
  • message 为 The percentage of an analytic distribution should be between 0 and 100.

如果某些产品/服务的价格为零,则无法应用约束。您可以删除 有问题的数据,以便应用新的约束。

Python约束

*odoo.api.constrains(args)
修饰约束检查器。

每个参数必须是检查中使用的字段名:

@api.constrains('name', 'description')
def _check_description(self):for record in self:if record.name == record.description:raise ValidationError("Fields name and description must be different")

在其中一个命名字段已被修改的记录上调用。

如果验证失败,将引发ValidationError。

警告

@constraints 只支持简单的字段名,不支持带点的名称(关系字段的字段,例如partner_id.customer),并且会被忽略。

只有当修饰方法中声明的字段包含在createwrite调用中时,@constraints才会被触发。这意味着视图中不存在的字段将不会在创建记录期间触发调用。create的重写是必要的,以确保约束总是会被触发(例如,测试是值是否为空)。

  • 也可以传递单个函数作为参数。在这种情况下,字段名是通过调用带有模型实例的函数来给出的。

目标

  • 设置报价不能低于预期价格的 90%。
    在这里插入图片描述
    SQL约束是确保数据一致性的有效方法。然而,可能需要进行更复杂的检查,这需要Python代码。在这种情况下,我们需要一个Python约束。

Python约束被定义为一个用constraints()修饰的方法,并在记录集上调用。装饰符指定约束中涉及哪些字段。当修改这些字段中的任何一个时,将自动评估约束。如果不满足其不变量,该方法预计会引发异常:

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

在这里可以找到一个简单的例子:

@api.constrains('product_id')def check_product_id(self):if any(elem.product_id.type != 'product' for elem in self):raise ValidationError(_('Quants cannot be created for consumables or services.'))@api.constrains('quantity')def check_quantity(self):for quant in self:if quant.location_id.usage != 'inventory' and quant.lot_id and quant.product_id.tracking == 'serial' \and float_compare(abs(quant.quantity), 1, precision_rounding=quant.product_uom_id.rounding) > 0:raise ValidationError(_('The serial number has already been assigned: \n Product: %s, Serial Number: %s') % (quant.product_id.display_name, quant.lot_id.name))@api.constrains('location_id')def check_location_id(self):for quant in self:if quant.location_id.usage == 'view':raise ValidationError(_('You cannot take products from or deliver products to a location of type "view" (%s).') % quant.location_id.name)
  • SQL 约束通常比 Python 约束更有效。当性能至关重要时,始终 首选 SQL 而不是 Python 约束。

我们的房地产模块开始看起来不错。我们添加了一些业务逻辑,现在我们确保 数据是一致的。但是,用户界面仍然有点粗糙。让我们看看如何 在下一章中改进它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【gRPC学习】使用go学习gRPC

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中&#xff0c;客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…

认识加密和解密

加密技术源远流长&#xff0c;自从古代有了信息的传递和存储&#xff0c;就有了加密技术的运用。此后&#xff0c;很长一段时间里&#xff0c;加密及解密技术在军事、政治、外交、金融等特殊领域里被普遍采用&#xff0c;并经过长时间的研究和发展&#xff0c;形成了比较完备的…

element plus 表格组件怎样在表格中显示图片

官方给的&#xff1a; <el-table-column label"Thumbnail" width"180"><template #default"scope"><div style"display: flex; align-items: center"><el-image :preview-src-list"srcList"/><…

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要&#xff1a;本文介绍变量和函数的基本知识 在前面一篇中了解了变量&#xff0c;接着就来了解一下函数。函数是程序中的一个关键概念&#xff0c;它可以简化程序的编写&#xff0c;使代码更加模块化、可复用&#xff0c;提高程序的可读性。其实在之前已经多次遇到函数了&am…

Arduion Modbus通讯示例

实现了Arduion和Qt上位机利用Modbus协议采集DHT11数据&#xff0c;以及开关LED灯 软件界面&#xff1a; 实物界面&#xff1a; arduion下位机代码&#xff1a; #include <ModbusRtu.h> #include <DHT.h>#define DHTPIN 2 // DHT11连接到Arduino的数字引…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中&#xff0c;我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱&#xff0c;然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…

学习尚硅谷Vue的TodoList案例下半部分总结

今天学习尚硅谷Vue的TodoList案例四到八节的内容&#xff0c;主要实现的功能有勾选、删除、底部统计、底部交互这几部分。先说勾选&#xff0c;想要获取到用户是否勾选&#xff0c;就要给checkbox多选框注册鼠标点击事件&#xff0c;这里的思路是用户虽然是获取到了是否勾选但还…

项目框架构建之3:Nuget服务器的搭建

本文是“项目框架构建”系列之3&#xff0c;本文介绍一下Nuget服务器的搭建&#xff0c;这是一项简单的工作&#xff0c;您或许早已会了。 1.打开vs2022创建Asp.net Web应用程序 框架选择.net framework4.8&#xff0c;因为nuget服务器只支持.net framework。 2.选择空项目和保…

C++ 学习系列 -- tuple 原理

一 可变参数模板 variadic template 前面的章节 C 学习系列 -- 模板 template-CSDN博客 我们介绍了 c 中的模板概念&#xff0c;本章则在其基础上介绍了新的概念 可变参数模板 variadic template &#xff0c;顾名思义&#xff0c;可变参数模板意思为模板参数的类型与数量是变…

微信小程序封装vant 下拉框select 单选组件

先上效果图&#xff1a; 主要是用vant 小程序组件封装的&#xff1a;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-popup 放在 components 文件夹里面 select-popup.wxml: <!--pages/select-popup/select-popup.wxml--> &…

爆肝整理,企业级性能测试-性能方案设计详细总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试策略 1&a…

【小沐学C++】C++ 实现鼠标键盘钩子HOOK

文章目录 1、简介2、相关函数2.1 SetWindowsHookEx2.2 UnhookWindowsHookEx2.3 CallNextHookEx 3、相关结构体3.1 KBDLLHOOKSTRUCT3.2 MSLLHOOKSTRUCT 4、挂钩过程5、代码测试5.1 代码1 结语 1、简介 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂…

Java学习笔记(十)——异常

一、异常的概念 二、异常体系图&#xff08;重要&#xff09; 三、常见的异常 &#xff08;一&#xff09;常见的运行时异常 1、NullPointerException空指针异常 2、ArithmeticException数学运算异常 3、ArrayIndexOutOfBoundsException数组下标越界异常 4、ClassCastEx…

CSS 压重按钮 效果

<template><view class="cont"><div class="container"><div class="pane"><!-- 选项1 --><label class="label" @click="handleOptionClick(0)":style="{ color: selectedOption ==…

约数个数和约数之和算法总结

知识概览 约数个数 由算数基本定理 可得对于N的任何一个约数d&#xff0c;有 因为N的每一个约数和~的一种选法是一一对应的&#xff0c;根据乘法原理可得&#xff0c; 一个数的约数个数为 约数之和 一个数的约数之和公式为 多项式乘积的每一项为 正好对应的是一个数的每一个约…

【网络安全】upload靶场pass11-17思路

目录 Pass-11 Pass-12 Pass-13 Pass-14 Pass-15 Pass-16 Pass-17 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x…

JetCache源码解析——配置加载和初始化

JetCache自动化配置加载 JetCache的配置加载主要是在jetcache-autoconfigure模块中完成的&#xff0c;其中加载配置的核心类是JetCacheAutoConfiguration&#xff0c;主要是用于创建全局性的一些Bean&#xff0c;例如全局缓存配置类GlobalCacheConfig&#xff0c;AutoConfigur…

数据密集型应用系统设计--第2章 数据模型与查询语言

一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是&#xff1a;如何将其用下一层来表示&#xff1f; 1.作为一名应用程序开发人员&#xff0c;观测现实…

yarn无法加载文件和‘vue-cli-service‘ 不是内部或外部命令解决方法

导致此错误的原因是&#xff0c;PowerShell 执行策略&#xff0c;默认设置为Restricted不加载配置文件或运行脚本。需变更设置为RemoteSigned&#xff0c;变更过程为&#xff1a; 1.运行 Windows PowerShell&#xff08;管理员&#xff09;&#xff0c;执行命令set-ExecutionPo…

使用redis时快速考虑的问题

使用场景 ap组件程序是否容忍极限丢失1s数据是否可以不依赖redis就能实现是否过度依赖redis 数据结构 5种结构选择不同结构有自己的限制&#xff0c;使用前需考虑限制考虑当前业务最适合那种解构&#xff0c;或多种解构混合使用 key设计 大keykey的格式热key敏感数据 过…