Odoo库存模块创建数据前校验参考编码重复问题求助
Odoo库存模块参考编码重复校验解决方案
方法一:使用Odoo约束装饰器(推荐)
Odoo自带的@api.constrains装饰器专门用于字段级校验,会自动在创建、修改记录时触发,完美适配你的需求。
代码示例
假设你的库存模型为自定义的stock.custom_model,代码如下:
from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class StockCustomModel(models.Model): _name = 'stock.custom_model' _description = '自定义库存模型' ref_code = fields.Char('参考编码', required=True) # 其他业务字段... @api.constrains('ref_code') def _check_ref_code_unique(self): for record in self: # 搜索数据库中重复的参考编码,修改时排除当前记录 existing_record = self.search([ ('ref_code', '=', record.ref_code), ('id', '!=', record.id) ], limit=1) if existing_record: raise ValidationError(_("参考编码 %s 已存在,无法创建或修改!") % record.ref_code)
关键说明
limit=1优化查询性能,找到重复记录后立即停止搜索- 抛出
ValidationError会自动拦截Odoo的创建/修改操作,同时给用户友好提示 - 适配创建和修改两种场景,修改时不会误判自身为重复
方法二:重写create方法(仅创建时校验)
如果只需要在创建记录时校验重复,可直接重写模型的create方法:
from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class StockCustomModel(models.Model): _name = 'stock.custom_model' _description = '自定义库存模型' ref_code = fields.Char('参考编码', required=True) # 其他业务字段... @api.model def create(self, vals): # 检查待创建数据的参考编码是否已存在 if vals.get('ref_code'): existing_record = self.search([('ref_code', '=', vals['ref_code'])], limit=1) if existing_record: raise ValidationError(_("参考编码 %s 已存在,无法创建!") % vals['ref_code']) # 调用父类方法完成创建 return super(StockCustomModel, self).create(vals)
常见排查点
如果之前对比逻辑失效,可检查以下几点:
- 搜索域是否正确:若需忽略大小写,可将
=改为ilike - 修改场景是否排除自身:修改时必须添加
('id', '!=', record.id)条件,避免误判 - 用户权限是否足够:确保当前用户有该模型的搜索权限,否则
search会返回空结果
内容的提问来源于stack exchange,提问作者Enes Kara
相关产品推荐
相关产品推荐

