关于odoo校验字段唯一性问题

        在校验一个字段时遇到一个问题,用@api.constrains进行验证,在方法里进行检索时一直获取不到正确的数据,研究半天发现这里搜索不止能搜索到数据库已存在的数据,也包括了当前新创建的记录对象,导致查询判断当前字段是否存在一直为真,以前看过odoo相关数据约束文章,却没注意到这一点,转载该文章巩固一下。

Odoo的数据约束抛错可分为三种情况

手动判断约束(create/write)
ORM层约束(api constrains)
数据库层约束(_sql_constrains)
从系统的执行优先级来看,顺序依次是 手动判断约束 -> 数据库层约束 -> ORM层约束

三种约束尽量不要同时使用,比如如果使用了手动判断约束,如果再添加了ORM层约束,通过ORM的search或者search_count方法搜出来的数据是包含当前正在创建并没有写入数据库的数据项。

1.手动约束:通过在model的create或者write方法中写条件判断,然后手动raise信息,这样可以控制抛错逻辑和抛错提示信息,比较常见。但需要注意的是,也许create/write的vals中需要校验的字段不一定是必输的,也就是说vals中可能缺失需要校验的值,这个一定好考虑到。


2.ORM层约束:通过写@api.constrains方法,来对数据库列进行进在这里插入图片描述行判断,可以控制判断逻辑和抛错。但需要注意,如果新创建单据的话,这个地方通过ORM会搜索到新创建的记录对象,可能需求是校验唯一性,这样的话ORM方法来判断就不是适用了。而且只有单据执行create和write方法后,才能走此校验api.

 

 


3.数据库层约束:直接给数据库表添加约束条件,无论是前台还是后台创建数据都会被校验,缺点是不能不能自己写复杂的判断逻辑,而且抛错会抛系统的key重复错误之类的。


1-2抛错:


3抛错:


————————————————
原文链接:https://blog.csdn.net/qq_29654325/article/details/88566213

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值