You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:54:27