Aplicando restricciones de unicidad en modelos de Odoo

Gustavo Orrillo
- 07/05/2022 - 1 min. de lectura

Muchas veces necesitamos agregar restricciones en los modelos de Odoo. Una bastante común es validar la unicidad de un campo, por ejemplo el código de un producto o de un cliente. Odoo brinda una clave única en cada modelo, es el campo id que se genera automáticamente por la base de datos cada vez que se inserta un registro en una tabla. Ahora, los códigos no necesitan ser los ids de la base de datos. Muchas veces en los clientes se necesita trabajar con claves creadas por los usuarios. Para estos casos necesitamos validar que estas claves sean únicas. Como hacemos esto con Odoo?

Hay dos formas, la primera es desarrollar un método constraint en el modelo para validar la unicidad. Supongamos que quiero asegurarme que el campo ref del modelo res.partner sea único. Para ello debo agregar al modelo res.partner el siguiente método

@api.constrains('ref')
def check_ref_unique(self):
    if self.ref and self.ref != '':
        partners = self.env['res.partner'].search([('ref','=',self.ref)]
        if len(partners) > 1:
            raise ValidationError('Ya existen partners con codigo %s'%(self.ref))

Supongamos que queremos actualizar un contacto y cambiar su campo de referencia a AZURE


Al actualizar el contacto, obtendremos el mensaje de error


Ahora si cambiamos el campo referencia al valor AZURE1


Este método tiene un par de ventajas. La primera es que se aplica para registros que se crean a futuro, no se aplica para registros ya creados. La segunda es que permite lógica dentro del constraint. La gran desventaja? Velocidad. Es por medio del ORM por ende es lento.

Otra manera de agregar constraints es por medio de SQL en el modelo:

_sql_constraints = [
    ('ref_unique','UNIQUE(ref)','El campo referencia del partner debe ser unico'),
]

El cual al actualizar el módulo, agrega un constraint a nivel base de datos. Si vemos la estructura de la tabla res_partner veremos el constraint:


 

Y si tratamos de insertar un registro, obtendremos el siguiente mensaje de error


Cuales son las desventajas de las restricciones de SQL? La gran ventaja es la velocidad, ya que el control se realiza a nivel base de datos. La gran desventaja es la falta de lógica en las mismas, ya que la lógica que se puede aplicar en las restricciones de SQL es limitada.

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.