I want to create a function which takes the new value and compares it with all records in my one2many field. When the same expression was found it should return a ValodationError. But somehow I cant get the one2many value. Also I dont want to modify the create function if possible.
from odoo import models, fields, api
from odoo.exceptions import UserError, AccessError, ValidationError
class MDMSolutions(models.Model):
_name = 'mdm.solutions'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "MDM Versions"
_rec_name = 'name'
name = fields.Char('Name', tracking=True, required=True)
mdm_versions_ids = fields.One2many(
'mdm.solutions.versions', 'mdm_class_id', string="MDM Versions")
@api.constrains('mdm_versions_ids.version')
def check_for_doubles(self):
version = self.mdm_versions_ids.version
if version in self.mdm_versions_ids:
raise ValidationError("This Version already exists!")
class MDMSolutionVersions(models.Model):
_name = 'mdm.solutions.versions'
_rec_name = 'version'
mdm_class_id = fields.Many2one(
'mdm.solutions', string="MDM Class")
version = fields.Char(string="Version", required=True)
You should put the constrain on the other model:
class MDMSolutionVersions(models.Model):
_name = 'mdm.solutions.versions'
_rec_name = 'version'
version = fields.Char(string="Version", required=True)
@api.constrains('version')
def _check_version(self):
rec_for_thisversion = self.env['mdm.solutions.versions'].search(
[('version', '=', self.version)])
if rec_for_thisversion:
raise ValueError(_('This Version already exists!'))
Alternatively, you could use an Sql-constrain on the field "version" in this model:
class MDMSolutionVersions(models.Model):
_name = 'mdm.solutions.versions'
_rec_name = 'version'
version = fields.Char(string="Version", required=True)
_sql_constraints = [('version', 'unique (version)', 'This version already exists!'),]